CMake: проверка доступности библиотек stati c C ++ - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь статически связать многопоточный двоичный файл. Было бы неплохо, если бы CMake мог предупредить, что отсутствуют библиотеки stati c.

Примечание: я знаю, что решением является установка библиотек stati c (libstdc ++ - stati c и glib c -stati c в Fedora 31, если это кому-нибудь поможет), я бы предпочел, чтобы об отсутствующих библиотеках сообщал CMake, а не при сборке.

(Как примечание, есть какой-нибудь более хороший способ поддержки связывания stati c? На данный момент у меня есть кое-что зависящее от платформы для поддержки наших целевых систем, я не нашел ничего более переносимого ...)

Вот Пример CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)

project(test)

set(CMAKE_CXX_STANDARD 17)

add_link_options(-static)
find_package(Threads REQUIRED)

add_executable(test)
target_link_libraries(test PRIVATE Threads::Threads)

target_sources(test PRIVATE test.cpp)

А вот вывод:

$ cmake ..
-- The C compiler identification is GNU 9.3.1
-- The CXX compiler identification is GNU 9.3.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sergio/src/static_cmake/build
$ make
Scanning dependencies of target test
[ 50%] Linking CXX executable test
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test.dir/build.make:101: test] Error 1
make[1]: *** [CMakeFiles/Makefile2:93: CMakeFiles/test.dir/all] Error 2
make: *** [Makefile:101: all] Error 2

1 Ответ

1 голос
/ 09 апреля 2020

Как прокомментировано, один из способов создания ошибки для отсутствующей библиотеки в CMake (до компиляции / компоновки) - использовать find_library(). Если CMake не может найти указанную библиотеку c, при использовании библиотечной переменной произойдет ошибка:

# Define a variable my_pthread_static_lib to store the library, if found.
find_library(my_pthread_static_lib libpthread.a)

add_executable(test)
# Error will occur here during CMake configuration, if not found
target_link_libraries(test PRIVATE ${my_pthread_static_lib})

Эта ошибка появится, если библиотека my_pthread_static_lib не найдена:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
my_pthread_static_lib
    linked by target "test" in directory /path/to/CMake/file
...