добавить стандартные библиотеки в RPATH для исполняемых файлов дерева сборки - PullRequest
0 голосов
/ 30 января 2019

В моей рабочей настройке мой «компилятор» представляет собой сценарий оболочки, который устанавливает несколько переменных среды и вызывает фактический компилятор (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).

...