我有一个简单的可执行文件,它使用~/mylib/lib/libmylib.so
上的库mylib中的函数。
在CMakeLists.txt
上,我告诉CMAKE在哪里可以找到库并将其链接:
find_library(MYLIB_PATH mylib HINT $ENV{HOME}/mylib/lib)
target_link_libraries (output "${MYLIB_PATH}")
执行cd build; cmake ..
之后,生成Makefile,并调用make
成功编译它
但假设我将CMakeLists.txt
上的第二行注释为
find_library(MYLIB_PATH mylib HINT $ENV{HOME}/mylib/lib)
# target_link_libraries (output "${MYLIB_PATH}")
并执行相同的cd build; cmake ..
我得到了完全相同的Makefile,但是make
失败了,出现了以下几种错误:
In function `Model::Model(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
Model.cpp:(.text+0x21): undefined reference to `TF_NewStatus'
它失败是有道理的,因为库没有链接。但是,如果两个Makefile都相同,为什么一个make
会失败,而另一个不会?
CMake为每个可执行文件和库创建执行链接步骤的link.txt
脚本。
该文件通过用于每个目标build.make
脚本
$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/<target-name>.dir/link.txt