CMake "TARGET_LINK_LIBRARIES cannot find -lfoo" 但它与另一个库位于同一目录中
CMake "TARGET_LINK_LIBRARIES cannot find -lfoo" but it is in the same directory as another library
如上所述,我在编译使用一些动态库 (.so) 的 C++ 项目(使用 CMake)时遇到问题。
我的目录中有 3 个库(即 home/sources/lib/
)。当我只告诉编译器(在 CMake 文件中)使用第一个库(foo1.so
)时,它工作(只有这个文件,顺序无关紧要)。但它不适用于任何其他库(foo2.so
和 foo2.so
)。所有 3 个文件都具有 .so 扩展名。
注意:目录和文件名已更改,但结构相同。
我使用的库不是由我编译/创建的,而是来自第三方。 (什么时候坏掉都无所谓吧?)
这就是我的 CMake 文件的样子:
cmake_minimum_required(VERSION 3.3)
project(MyProj)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -m64")
INCLUDE_DIRECTORIES("/home/sources/include")
LINK_DIRECTORIES("/home/sources/lib")
set(SOURCE_FILES main.cpp)
add_executable(MyProj ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(MyProj foo1.so)
将以上行更改为此不再有效:
TARGET_LINK_LIBRARIES(MyProj foo1.so foo2.so foo3.so)
只是另一种写法(没有帮助)
TARGET_LINK_LIBRARIES(MyProj foo1.so)
TARGET_LINK_LIBRARIES(MyProj foo2.so)
TARGET_LINK_LIBRARIES(MyProj foo3.so)
并且如上所述:所有 3 个库都在同一个目录中(我用 LINK_DIRECTORIES
引用)
这是我在尝试使用其他库进行编译时遇到的错误(如前所述,仅 foo1.so
有效):
[ 50%] Linking CXX executable MyProj
/usr/bin/ld: cannot find -lfoo2
/usr/bin/ld: cannot find -lfoo3
collect2: error: ld returned 1 exit status
make[3]: *** [MyProj] Error 1
make[2]: *** [CMakeFiles/MyProj.dir/all] Error 2
make[1]: *** [CMakeFiles/MyProj.dir/rule] Error 2
make: *** [MyProj] Error 2
P.S.: 在发帖之前我做了一些研究,但没有发现其他人有这个 "strange" 问题。如果没有一些谷歌搜索技巧,我肯定不会用我的 CMake 文件走到这一步 ^^
不确定,但在我看来 CMake 正在寻找 libfoo1.so
而文件实际上是 foo1.so
(同样适用于 foo2
和 foo3
)
尝试 "importing" 库:
add_library(foo1 SHARED IMPORTED)
set_property(TARGET foo1 PROPERTY IMPORTED_LOCATION "/home/sources/lib/libfoo1.so")
# same thing for foo2 and foo3 ...
target_link_libraries(MyProj foo1 foo2 foo3)
编辑
也可以提供库的完整路径:
target_link_libraries(MyProj "/home/sources/lib/libfoo1.so"
"/home/sources/lib/libfoo2.so"
"/home/sources/lib/libfoo3.so")
如上所述,我在编译使用一些动态库 (.so) 的 C++ 项目(使用 CMake)时遇到问题。
我的目录中有 3 个库(即 home/sources/lib/
)。当我只告诉编译器(在 CMake 文件中)使用第一个库(foo1.so
)时,它工作(只有这个文件,顺序无关紧要)。但它不适用于任何其他库(foo2.so
和 foo2.so
)。所有 3 个文件都具有 .so 扩展名。
注意:目录和文件名已更改,但结构相同。 我使用的库不是由我编译/创建的,而是来自第三方。 (什么时候坏掉都无所谓吧?)
这就是我的 CMake 文件的样子:
cmake_minimum_required(VERSION 3.3)
project(MyProj)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -m64")
INCLUDE_DIRECTORIES("/home/sources/include")
LINK_DIRECTORIES("/home/sources/lib")
set(SOURCE_FILES main.cpp)
add_executable(MyProj ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(MyProj foo1.so)
将以上行更改为此不再有效:
TARGET_LINK_LIBRARIES(MyProj foo1.so foo2.so foo3.so)
只是另一种写法(没有帮助)
TARGET_LINK_LIBRARIES(MyProj foo1.so)
TARGET_LINK_LIBRARIES(MyProj foo2.so)
TARGET_LINK_LIBRARIES(MyProj foo3.so)
并且如上所述:所有 3 个库都在同一个目录中(我用 LINK_DIRECTORIES
引用)
这是我在尝试使用其他库进行编译时遇到的错误(如前所述,仅 foo1.so
有效):
[ 50%] Linking CXX executable MyProj
/usr/bin/ld: cannot find -lfoo2
/usr/bin/ld: cannot find -lfoo3
collect2: error: ld returned 1 exit status
make[3]: *** [MyProj] Error 1
make[2]: *** [CMakeFiles/MyProj.dir/all] Error 2
make[1]: *** [CMakeFiles/MyProj.dir/rule] Error 2
make: *** [MyProj] Error 2
P.S.: 在发帖之前我做了一些研究,但没有发现其他人有这个 "strange" 问题。如果没有一些谷歌搜索技巧,我肯定不会用我的 CMake 文件走到这一步 ^^
不确定,但在我看来 CMake 正在寻找 libfoo1.so
而文件实际上是 foo1.so
(同样适用于 foo2
和 foo3
)
尝试 "importing" 库:
add_library(foo1 SHARED IMPORTED)
set_property(TARGET foo1 PROPERTY IMPORTED_LOCATION "/home/sources/lib/libfoo1.so")
# same thing for foo2 and foo3 ...
target_link_libraries(MyProj foo1 foo2 foo3)
编辑
也可以提供库的完整路径:
target_link_libraries(MyProj "/home/sources/lib/libfoo1.so"
"/home/sources/lib/libfoo2.so"
"/home/sources/lib/libfoo3.so")