2016-09-06 2 views
2

Я работаю над проектом C/C++, и я использую CMAKE 3.5.2 для сборки. Однако теперь я должен включить файл C++, который использует функции Octave. Я могу скомпилировать этот исходный файл напрямую с помощью командной строки, используя следующую команду: mkoctfile --link-stand-alone new_oct_file -o final_library.CMAKE и MKOCTFILE

Я изо всех сил пытаюсь выполнить команду CMAKE. Я попытался использовать add_custom_command, но это не сработало. Может мне помочь?

Мой Cmake имеет следующую структуру

cmake_minimum_required(VERSION 2.8) 

project(final_library) 

add_executable(final_library program.c 
./Commons/util.c 
./Tools/xulambs_tool.cpp) 

find_package(Boost REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 
include_directories(/usr/include/octave-4.0.0/octave) 

install(TARGETS final-library RUNTIME DESTINATION bin) 

add_subdirectory(Commons) 
add_subdirectory(Tools) 

Я пытался добавить следующую команду (она не работает):

set(MKOCTFILE "mkoctfile") 
set(OCTARG "--link-stand-alone") 
add_custom_command(TARGET reordering-library 
     PRE_LINK 
     COMMAND ${MKOCTFILE} ARGS ${OCTARG} ./Tools/tool_octave.cpp) 

Выход компиляции

[ 4%] Linking CXX executable final-library 
g++: error: ./Tools/tool_octave.cpp: No such file or directory 
g++: fatal error: no input files 
compilation terminated. 
CMakeFiles/final-library.dir/build.make:694: recipe for target 'final-library' failed 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/final-library.dir/all' failed 
Makefile:127: recipe for target 'all' failed 
make[2]: *** [final-library] Error 1 
make[1]: *** [CMakeFiles/final-library.dir/all] Error 2 
make: *** [all] Error 2 

Спасибо.

+0

Это: https://cmake.org/cmake/help /v3.0/prop_sf/GENERATED.html должен помочь –

ответ

1

Команда в предварительной ссылке, вероятно, не выполняется в исходном каталоге, поэтому относительный путь, который вы использовали в скрипте, будет недействительным. Попробуйте использовать абсолютный путь, что-то вроде:

add_custom_command(TARGET reordering-library 
    PRE_LINK 
    COMMAND ${MKOCTFILE} ARGS ${OCTARG} 
    "${CMAKE_CURRENT_SOURCE_DIR}/Tools/tool_octave.cpp" 
) 
+0

Спасибо за ответ. Но я попробовал ваше предложение. Все изменилось. – tnas

+2

@tnas Это решение в основном правильное, вам нужно выяснить, в каком пути путь неправильный. Попробуйте напечатать путь с помощью 'message (STATUS) $ {CMAKE_CURRENT_SOURCE_DIR} /Tools/tool_octave.cpp") ' – Antonio

+0

. Предложение @wasthishelpul в порядке. Но моя пользовательская команда не запускается. Я редактировал его как 'set (OCTAVETOOL) $ {CMAKE_CURRENT_SOURCE_DIR} /Tools/tool_octave.cpp") add_custom_command (OUTPUT tool_octave.out COMMAND mkoctfile --link-stand-alone $ {OCTAVETOOL} COMMENT "- Компиляция инструмента Octave алгоритм. ")'. Консоль не отображает мой комментарий. Зачем? – tnas

0

У меня была такая же проблема, как вы и я установил его, добавив liboctinterp.so в target_link_libraries файла CMakeLists.txt.

Мой текущий файл CMake содержит следующее:

add_executable (MyEXE main.cc) target_link_libraries (MyEXE liboctave.so liboctinterp.so)