Makefile Cmake:如何检查库是否链接到可执行文件
我正在将第三方库与我的可执行文件链接。我已经成功链接了其他一些库。我不明白我做错了什么 这就是导致问题的原因Makefile Cmake:如何检查库是否链接到可执行文件,makefile,cmake,Makefile,Cmake,我正在将第三方库与我的可执行文件链接。我已经成功链接了其他一些库。我不明白我做错了什么 这就是导致问题的原因 # Build libssh 0.7.3 ExternalProject_Add(libssh2 URL ${PROJECT_SOURCE_DIR}/packages/libssh.tar.gz PREFIX ${CMAKE_BINARY_DIR}/external/libssh2 CONFIGURE_COMMAND ""
# Build libssh 0.7.3
ExternalProject_Add(libssh2
URL ${PROJECT_SOURCE_DIR}/packages/libssh.tar.gz
PREFIX ${CMAKE_BINARY_DIR}/external/libssh2
CONFIGURE_COMMAND ""
UPDATE_COMMAND ""
BUILD_COMMAND mkdir -p <SOURCE_DIR>/build && cd <SOURCE_DIR>/build &&
cmake -DWITH_STATIC_LIB=1 -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Debug .. && make
INSTALL_COMMAND cd <SOURCE_DIR>/build && make install PREFIX=<INSTALL_DIR>
)
ExternalProject_Get_Property(libssh2 install_dir)
add_library(libssh STATIC IMPORTED)
set_property(TARGET libssh PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libssh.a)
add_dependencies(libssh libssh2)
include_directories(${install_dir}/include)
已正确创建库
ExternalProject_Add(libevent2
URL ${PROJECT_SOURCE_DIR}/packages/libevent-2.0.21-stable.tar.gz
PREFIX ${CMAKE_BINARY_DIR}/external/libevent2
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
UPDATE_COMMAND ""
)
ExternalProject_Get_Property(libevent2 install_dir)
add_library(libevent STATIC IMPORTED)
set_property(TARGET libevent PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libevent.a)
add_dependencies(libevent libevent2)
include_directories(${install_dir}/include)
[nikhil@nikhil lib]$ ls
cmake libssh.a libssh.so libssh.so.4 libssh.so.4.4.1 libssh_threads.a libssh_threads.so libssh_threads.so.4 libssh_threads.so.4.4.1 pkgconfig
[nikhil@nikhil lib]$ pwd
/home/nikhil/nixia/build/external/libssh2/lib
该库包含函数定义
[nikhil@nikhil lib]$ ar x libssh.a | nm * | grep ssh_new
nm: Warning: 'cmake' is not an ordinary file
U ssh_new
0000000000000000 T ssh_new
00000000000351b0 T ssh_new
00000000000351b0 T ssh_new
00000000000351b0 T ssh_new
我建议您使用CMake详细模式进行编译,以便检查用于编译它的完整命令 为此,必须使用以下命令进行编译:
make VERBOSE=1
通过这种方式,您可以检查哪个库被链接以识别问题
未定义参考错误的可能原因:
- 未找到库(检查g++命令中的-L和-L标志是否正确,如果出现错误,请修改CMake以获得所需的结果)李>
- 在同一个系统上,同一个库有多个版本(在您的例子中是libssh):编译器可以使用一个版本的头文件,而另一个版本的库可能具有不同的签名,从而产生链接错误
make VERBOSE=1
通过这种方式,您可以检查哪个库被链接以识别问题
未定义参考错误的可能原因:
- 未找到库(检查g++命令中的-L和-L标志是否正确,如果出现错误,请修改CMake以获得所需的结果)李>
- 在同一个系统上,同一个库有多个版本(在您的例子中是libssh):编译器可以使用一个版本的头文件,而另一个版本的库可能具有不同的签名,从而产生链接错误
target_link_libraries
是您所需要的<代码>添加库只是为库创建了一个无法执行的目标。这可能与?也许你的链接器确实找到了另一个libssh。一个就是你的系统,因为CMake只是放了一个-lssh
?检查命令行的外观。并尝试向您的添加库(libssh STATIC IMPORTED)
调用添加一个全局
。您的可执行文件是否也针对所有库进行链接?您没有列出该部分。是的,它们是..add_library()这样做我认为target_link_libraries
是您所需要的<代码>添加库
只是为库创建了一个无法执行的目标。这可能与?也许你的链接器确实找到了另一个libssh。一个就是你的系统,因为CMake只是放了一个-lssh
?检查命令行的外观。并尝试向add_库(libssh STATIC IMPORTED)
调用添加一个GLOBAL
。