如上所述,我在使用一些动态库(.so)编译我的c ++项目(使用CMake)时遇到了问题.我的目录中有3个库(即home/sources/lib/
).当我只告诉编译器(在CMake文件中)使用第一个lib(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个库都在SAME目录中(我指的是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
PS:我在发布之前做了一些研究,但没有发现任何其他人有这个"奇怪"的问题.而且我肯定不会在没有谷歌搜索技能的情况下使用我的CMake文件到目前为止^^
不确定,但是在我看来CMake正在寻找libfoo1.so
文件,而实际上是foo1.so
(与foo2
和相同foo3
)
尝试“导入”库:
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")