Ниже приведен рабочий пример правильного проекта CMake:
Структура каталогов:
ROOT
|
+--inc
| +--ConsoleLog.hpp
+--src
| +--ConsoleLog.cpp
| +--main.cpp
+CMakeLists.txt
Ваши исходные файлы и файлы заголовков остаются неизменными (я только изменил * .h на * .hpp-> после всего, что вы пишете на C ++, а не на C).
main.cpp:
#include "ConsoleLog.hpp"
int main() {
my_commons::ConsoleLog log;
log.ROSLog(1, "xxx", "yyy");
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(my_commons)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
find_package(catkin REQUIRED COMPONENTS roscpp)
add_library(my_commons STATIC src/ConsoleLog.cpp)
target_include_directories(my_commons PUBLIC inc ${roscpp_INCLUDE_DIRS})
target_link_libraries(my_commons ${catkin_LIBRARIES} ${roscpp_LIBRARIES})
add_executable(MyExec src/main.cpp)
target_link_libraries(MyExec my_commons)
Результат выполнения:
./MyExec
[ INFO] [1528280295.971205050]: ########## yyy xxx ##########
Я использую более новую версию CMake, чтобы использовать target_include_directories
, потому что мне нравится эта функция.Я изменил флаги вашего компилятора, чтобы включить стандарт C ++ 11, потому что, очевидно, вы используете его.Я также удалил правила INSTALL CMake, потому что они не имеют отношения к вопросу.Дайте мне знать, если этот ответ вам подходит.
=============== РЕДАКТИРОВАТЬ (ответить на комментарий OP) ==============
Что ж, у меня нет проблем с встраиванием этой библиотеки в другую структуру проекта.Полученная ошибка означает, что ваша структура каталогов неверна (my_commons
dir не существует).Дерево вашего проекта должно выглядеть следующим образом:
ROOT
|
+--MyCommonsLib (this is the root of your my_commons library)
|
+--src
| +--main.cpp
+CMakeLists.txt
И CMakeLists.txt
вашего проекта может выглядеть так:
cmake_minimum_required(VERSION 2.8.11)
project(SomeSimpleProjectUsingMyCommonsLib)
add_subdirectory(MyCommonsLib)
add_executable(MyExec src/main.cpp)
target_link_libraries(MyExec my_commons)
Просто не забудьте удалить инструкцию add_executable
из вашего MyCommonLib/CMakeLists.txt
.Также main.cpp
должно быть таким:
#include "ConsoleLog.hpp"
int main() {
my_commons::ConsoleLog::ROSLog(1, "xxx", "yyy");
return 0;
}
Извините, пока я не заметил, что ROSLog
объявлен как статический.