CMake: как я могу принудительно использовать cmake для статической ссылки openmp?

#c #cmake #cross-platform #openmp

#c #cmake #кроссплатформенный #openmp

Вопрос:

Я знаю, как использовать cmake для кросс-платформенной связи openmp

 find_package(OpenMP REQUIRED)
link_libraries(OpenMP::OpenMP_CXX)
  

Но я не знаю, как заставить cmake статически связать openmp, фактически, вся официальная переменная cmake о библиотеке openmp является динамической.
В любом случае, не кроссплатформенный способ сделать это:

 clang   -std=c  2a test.cpp -Iinclude -march=native -O3 -c          
clang   test.o -o test.x /usr/local/lib/libomp.a -pthread  
  

или если вы используете gcc

 g  -10 -std=c  2a test.cpp -Iinclude -march=native -O3 -c 
g  -10 test.o -o test.x /usr/local/opt/gcc/lib/gcc/10/libgomp.a -pthread 
  

Кстати, это дефект cmake или есть какой-либо другой способ его выполнить

Комментарии:

1. Статическое связывание библиотеки OpenMP потенциально является плохой идеей. Если вы сделаете это, а также используете библиотеку, которая сама это делает, вы получите два экземпляра среды выполнения OpenMP, и это может привести к чрезмерной подписке (созданию большего количества потоков, чем у вас есть logicalCPUs) и даже к неправильному выполнению (например, onp single будет защищать код только откод, использующий тот же экземпляр библиотеки). Итак, если вы это сделаете, будьте очень осторожны…

2. @JimCownie Я понимаю вашу идею, ваш комментарий может быть ответом на вопрос, некоторые библиотеки не подходят для статической ссылки, например, OpenMP

Ответ №1:

Не ответ, но слишком много, чтобы вписаться в комментарий.

Я ничего не знаю об OpenMP, кроме того, что cmake поддерживает его: https://cmake.org/cmake/help/latest/module/FindOpenMP.html ?выделить = openmp.

Я не вижу ни одной документации, ссылающейся на static / shared. Возможно, вы правы, и он поддерживает только общие библиотеки.

Дважды проверьте, задав официальный вопрос make: https://discourse.cmake.org /

Вы также можете попробовать прочитать официальный модуль FindOpenMP.cmake, поскольку все это с открытым исходным кодом.

Редактировать:

Если вы правы, в cmake отсутствует эта функциональность, подумайте о том, чтобы внести свой вклад и добавить его 🙂

Комментарии:

1. Да, я пытаюсь отправить сообщение обо всех переменных в ссылке , только чтобы узнать, что все переменные, связанные с библиотекой, относятся к динамической библиотеке, если это так, возможно, мне следует позже сообщить об ошибке в CMake official

2. @Wongboo Вы когда-нибудь выясняли это или публиковали ошибку? Я тоже хочу статическую ссылку OpenMP.

3. @Teharez, я думаю, комментарий Джима верен, я предлагаю вам не статическую ссылку openmp, если вы настаиваете, я пишу способ для macOS, попробуйте использовать его.