Как установить флаги компилятор через cmake?

326
20 мая 2018, 21:40

столкнулся с проблемой, для компилирования программы надо указать gcc флаги -I -L -l. Так вот не получается установить данные флаги в cmake. Подскажите как правильно устанавливать данные флаги?

Проблема больше относиться к tensorflow.

Tensorwlof Install C

Внизу есть пункт о решении проблем с компиляцией. Проверил действительно оно решает данную проблему. Но только через командную строку

gcc -I /opt/tensorflow/include -L /opt/tensorflow/lib tenso.c -l tensorflow

А так как у меня проект, то флаги нужно указать в cmake.

Код из файла CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(tensorflow_example)
set(CMAKE_CXX_STANDARD 11)
include_directories(/opt/tensorflow/include)
link_directories(/opt/tensorflow/lib)
target_link_libraries(tensorflow_example tensorflow)
add_executable(tensorflow_example main.cpp)

Генерирует вот такую ошибку:

/snap/clion/19/bin/cmake/bin/cmake --build /home/lev/CLionProjects/tensorflow/cmake-build-debug --target all -- -j 2 CMake Error at CMakeLists.txt:9 (target_link_libraries): Cannot specify link libraries for target "tensorflow_example" which is not built by this project.

Answer 1

Я не знаю, что эти флаги для gcc означают(почему то смутное сомнение, не флаги ли это линковки, а не компиляции). Я вам отвечу на вопрос об общем подходе добавления флагов компиляции, так как вы об этом спрашиваете.
Давайте добавим наши флаги компиляции в некую константу

SET(MYCOMPILE_FLAGS "-l -L -l")

Теперь мы может поступить одним из следующих способов:

  1. Еще один подход появился с версии Cmake 3.0.2. Можно использовать для этого специальную команду target_compile_options

    target_compile_options(${ourtargetname} ${MYCOMPILE_FLAGS})
    

    Первым аргументом(${ourtargetname}) необходимо передать ваше имя сборки(target-а), при компиляции которой будут применены переданные флаги.

  2. Добавить флаги компиляции в предопределенную переменную CMAKE_C_FLAGS(или в CMAKE_CXX_FLAGS, если у вас компиляции с++ исходников), которые содержать дефолтные флаги компиляции соответствующих компиляторов.

    SET(CMAKE_C_FLAGS  "${CMAKE_C_FLAGS} ${MYCOMPILE_FLAGS }")
    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${MYCOMPILE_FLAGS }")
    

    Или можно добавить новые параметры в переменную через команду LIST(спасибо @Ixsci за дополнение)

    LIST(append CMAKE_C_FLAGS ${MYCOMPILE_FLAGS })
    LIST(append CMAKE_CXX_FLAGS ${MYCOMPILE_FLAGS })
    
  3. Добавить флаги компиляции с помощью команды add_definitions.

    add_definitions(${MYCOMPILE_FLAGS})
    

    Эта команда предназначена в первую очередь для добавления препроцессорных переменных при компиляции исходников, но передача флагов компиляции для компилятора также должна работать.

Теперь ответ на вопрос(не знаю, если сообщество скажет предыдущий текст удалить, я его удалю)

Чтобы установить дополнительный путь до заголовочных файлов, вы должны воспользоваться командой include_directories

include_directories(/opt/tensorflow/include)

Чтобы добавить дополнительный путь для поиска библиотек линковщику, необходимо воспользоваться командой link_directories

link_directories(/opt/tensorflow/lib)

Чтобы прилинковать библиотеку tensorflow к цели(exe или dll), которая вероятно находиться в папке /opt/tensorflow/lib, нужно вызвать команду target_link_libraries

target_link_libraries(${ourtargetname} tensorflow)

Первым аргументом(${ourtargetname}) необходимо передать ваше имя сборки(target-а)

${ourtargetname}- это название выходного файла, имя сборки. Это имя вы указываете первым параметром либо в команде add_executable(если собираете exe файл), либо в add_library(если собираете библиотеку). В вашем примере вы собираете exe файл, поэтому в CMakeLists ищите функцию add_executable и увидите в ней имя сборки в первом параметре.

READ ALSO
Как можно синхронизировать C++ и Python

Как можно синхронизировать C++ и Python

Всем привет! Столкнулся с такой необходимостью, у меня есть код, написанный на C++ это программа со статистикой(там диаграмма и графики)И есть...

215
Библиотеки для распознавания речи [требует правки]

Библиотеки для распознавания речи [требует правки]

Какие библиотеки лучше использовать? Какие книги, мануалы посоветуетеСпасибо

241
Скомпилировать dll в Сlion под ubuntu

Скомпилировать dll в Сlion под ubuntu

Как скомпилировать dll в Сlion под ubuntu, компилятор g++, сборщик Cmake

203
Мобильная версия не открывается на IPhone

Мобильная версия не открывается на IPhone

У меня адаптивный сайт на Bootdtrap 4, я использовала отдельно медиа запросы, сайт работает на всех устройствах, кроме последних версий IOS IphoneОн...

243