CMAKE如何告诉makefile链接库?

3

我有一个简单的可执行文件,它使用库mylib中的函数,该库位于~/mylib/lib/libmylib.so

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 失败而另一个则没有呢?


2
你第二次清理了目录吗?也许CMakeCache.txt与此有关。 - RoQuOTriX
你怎么知道你得到了“完全相同的Makefile”?CMake会为构建过程创建多个文件,你都检查过了吗? - Some programmer dude
@Someprogrammerdude 我在它们之间执行了 sdiff -s 命令,结果为空。 - Bersan
1个回答

5

CMake会为每个可执行文件和库创建一个 link.txt 脚本,用于执行链接步骤。

该文件在每个目标的 build.make 脚本中使用。

$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/<target-name>.dir/link.txt

我一直以为CMAKE会生成一个简单、"独立"的Makefile用于编译,但我刚刚意识到这个文件包含了CMakeFiles/文件夹中的其他文件,还有许多其他隐藏的配置。 - Bersan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接