13

CMake は、リンカー フラグを GCC コンパイル コマンドの最後に追加するのではなく、先頭に追加するようです。CMakeにリンカーフラグを追加させる方法は?

問題を再現する簡単な例を次に示します。を使用する次の C++ コードを検討してくださいclock_gettime

// 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;
}

これは、上記の C++ ファイルをコンパイルするための CMakeLists.txt です。

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にリンカーフラグを最後に追加させる方法は?

4

1 に答える 1