Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile Cmake:如何检查库是否链接到可执行文件_Makefile_Cmake - Fatal编程技术网

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):编译器可以使用一个版本的头文件,而另一个版本的库可能具有不同的签名,从而产生链接错误

我建议您使用CMake verbose模式进行编译,以检查用于编译的完整命令

为此,必须使用以下命令进行编译:

make VERBOSE=1
通过这种方式,您可以检查哪个库被链接以识别问题

未定义参考错误的可能原因:

  • 未找到库(检查g++命令中的-L和-L标志是否正确,如果出现错误,请修改CMake以获得所需的结果)
  • 在同一个系统上,同一个库有多个版本(在您的例子中是libssh):编译器可以使用一个版本的头文件,而另一个版本的库可能具有不同的签名,从而产生链接错误

您的可执行文件是否也针对所有库进行链接?您没有列出该部分。是的,它们是..add_library()这样做我认为
target_link_libraries
是您所需要的<代码>添加库只是为库创建了一个无法执行的目标。这可能与?也许你的链接器确实找到了另一个
libssh。一个
就是你的系统,因为CMake只是放了一个
-lssh
?检查命令行的外观。并尝试向您的
添加库(libssh STATIC IMPORTED)
调用添加一个
全局
。您的可执行文件是否也针对所有库进行链接?您没有列出该部分。是的,它们是..add_library()这样做我认为
target_link_libraries
是您所需要的<代码>添加库
只是为库创建了一个无法执行的目标。这可能与?也许你的链接器确实找到了另一个
libssh。一个
就是你的系统,因为CMake只是放了一个
-lssh
?检查命令行的外观。并尝试向
add_库(libssh STATIC IMPORTED)
调用添加一个
GLOBAL