2015-05-21 3 views
1

Я написал макрос, который вызывает функцию TARGET_LINK_LIBRARIES:CMake ошибка в макро с target_link_libraries

macro(Link_Libs cur_target) 

#ATLAS LIBS on Linux 

add_library(ptlapack STATIC IMPORTED) 
set_property(TARGET ptlapack PROPERTY 
       IMPORTED_LOCATION /usr/local/atlas/lib/libptlapack.a) 

TARGET_LINK_LIBRARIES(cur_target ptlapack) 
endmacro() 

Тогда я назвал макрос из проекта

project(CPU_Matrix) 
cmake_minimum_required(VERSION 2.8) 

aux_source_directory(./src/ SRC_LIST1) 
include_directories(./include/) 

add_executable(CPU_Matrix ${SRC_LIST1}) 

INCLUDE(${CMAKE_MODULE_PATH}/LinkLibs.txt NO_POLICY_SCOPE) 
Link_Libs(CPU_Matrix_Class_Test_Satisfy) 

Когда я бегу CMake, он дал ошибку:

Cannot specify link libraries for target "cur_target" which 
is not built by this project 

Как я могу связать библиотеки в макросе?

ответ

2

Это, вероятно, только потому, что вы не разыскиваете переменную cur_target внутри макроса. Вы должны были бы сделать:

target_link_libraries(${cur_target} ptlapack) 

Как это, вы бы только быть в состоянии назвать этот макрос один раз, так как вы не можете держать повторное добавление ptlapack снова и снова. Вы должны добавить охрану, чтобы не пытаться добавить библиотеку несколько раз, например.

if(NOT TARGET ptlapack) 
    add_library(ptlapack STATIC IMPORTED) 
    set_property(TARGET ptlapack PROPERTY 
       IMPORTED_LOCATION /usr/local/atlas/lib/libptlapack.a) 
endif() 

И, наконец, не рекомендуется указывать локальный путь следующим образом. «/usr/local/atlas/lib/libptlapack.a» может быть там, где библиотека находится на вашей машине, но это может быть не так для каждой машины, и это, безусловно, не кросс-платформенный :-)

+0

Спасибо оно работает. Я изучаю библиотеку. Как связать библиотеки, которые были установлены мной (а не из хранилища)? – Oleg

+0

Вы можете использовать ['find_library'] (http://www.cmake.org/cmake/help/v3.2/command/find_library.html), чтобы найти библиотеку. – Fraser

Смежные вопросы