如何使CMake附加链接器标志而不是前置它们?

时间:2014-03-11 05:12:21

标签: gcc linker cmake linker-flags

CMake似乎在GCC编译命令的前面添加链接器标志,而不是在末尾附加它。如何使CMake附加链接器标志?

这是一个重现问题的简单示例。 请考虑使用clock_gettime

的此C ++代码
// main.cpp
#include <iostream>
#include <time.h>

int main()
{
    timespec t;
    clock_gettime(CLOCK_REALTIME, &t);
    std::cout << t.tv_sec << std::endl;
    return 0;
}

这是一个CMakeLists.txt来编译上面的C ++文件:

cmake_minimum_required(VERSION 2.8)
set(CMAKE_EXE_LINKER_FLAGS "-lrt")
add_executable(helloapp main.cpp)

请注意,我们添加了-lrt,因为它的定义为clock_gettime

使用以下方法进行编译:

$ ls
  CMakeLists.txt main.cpp
$ mkdir build
$ cd build
$ cmake ..
$ make VERBOSE=1

即使您在命令中看到-lrt,也会引发此错误:

/usr/bin/c++ -lrt CMakeFiles/helloapp.dir/main.cpp.o -o helloapp -rdynamic 
CMakeFiles/helloapp.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make[2]: *** [helloapp] Error 1

这里的问题是CMake生成的C ++编译命令前面有-lrt。编译工作正常,如果它是:

/usr/bin/c++ CMakeFiles/helloapp.dir/main.cpp.o -o helloapp -rdynamic -lrt

如何让CMake在末尾附加链接器标志?

1 个答案:

答案 0 :(得分:10)

一般情况下你不能(我认为),但在特定情况下你要链接特定的库,你应该使用语法

target_link_libraries(helloapp rt)

代替。 CMake知道这对应于在链接器命令行上传递-lrt