Добавить стандартные библиотеки в RPATH для исполняемых файлов дерева сборки

В моей рабочей настройке мой "компилятор" представляет собой скрипт оболочки, который устанавливает несколько переменных среды и вызывает фактический компилятор (clang-wrapper):

#!/bin/sh
export PATH=/path_to_clang_install/bin:/path_to_gcc_install/bin${PATH:+:$PATH}
export LD_LIBRARY_PATH=/path_to_clang_install/lib64:/path_to_gcc_install/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
exec /path_to_clang_install/bin/clang++ --gcc-toolchain=/path_to_gcc_install "$@"

Насколько я понимаю, cmake и ctest добавляют все каталоги ссылок в RPATH связанных исполняемых файлов в каталоге сборки и удаляют RPATH для каталога установки. (на данный момент меня не волнует каталог установки, и с objdump -x Я вижу, что каталоги библиотек, которые я добавляю target_link_libraries появляются в RPATH).

Тем не менее, каталоги стандартных библиотек компилятора (/path_to_clang_install/lib64) не добавляется в RPATH.

Как минимальный рабочий пример, у меня есть

CMakeLists.txt

add_executable(foo foo.cc)
enable_testing()
add_test(NAME foo COMMAND foo)

foo.cc

#include <string>
int main(int, char** argv) {
  return std::string(argv[0]).length();
}

который я потом строю

cmake .. -DCMAKE_CXX_COMPILER=clang-wrapper -DCMAKE_C_COMPILER=clang-wrapper
cmake --build .
ctest

Тест обычно не проходит

UpdateCTestConfiguration  from :<buildpath>/DartConfiguration.tcl
UpdateCTestConfiguration  from :<buildpath>/DartConfiguration.tcl
Test project <buildpath>
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
    Start 1: foo

1: Test command: <buildpath>/foo
1: Test timeout computed to be: 10000000
1: <buildpath>/foo: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by <buildpath>/foo)
1/1 Test #1: foo ..............................***Failed    0.02 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.13 sec

The following tests FAILED:
          1 - foo (Failed)
Errors while running CTest

(компоновщик вызывается с /path_to_clang_wrapper/clang-wrapper -rdynamic CMakeFiles/foo.dir/foo.o -o foo.)

Я попытался изложить стандартные библиотеки с

enable_testing()
link_directories(/path_to_gcc/lib64)
add_executable(foo foo.cc)
target_link_libraries(foo /path_to_gcc/lib64/libstdc++.so)

но это только добавило -lstdc++ на вызов компоновщика. Я проверил, что если я сделаю ссылку на какую-нибудь некомпиляционную библиотеку, вызов компоновщика получит дополнительную -L/path_to_random_lib/lib -Wl,-rpath,/path_to_random_lib/lib -lrandomlib,

Итак, мой вопрос: как я могу добавить стандартные библиотеки компилятора в RPATH с помощью cmake? Я понимаю, что исполняемые файлы и тесты в дереве сборки в остальном практически не зависят от переменных среды (LD_LIBRARY_PATH).

0 ответов

Другие вопросы по тегам