Boost 从Makefile迁移到CMake时出错
我有一个库,它使用Makefile编译时不会出错。 现在我想切换到CMake,但它不起作用 源代码和生成文件是。 在我保存的所有文件夹中,有以下内容:Boost 从Makefile迁移到CMake时出错,boost,cmake,Boost,Cmake,我有一个库,它使用Makefile编译时不会出错。 现在我想切换到CMake,但它不起作用 源代码和生成文件是。 在我保存的所有文件夹中,有以下内容:can\u socket、can\u virtual、timers\u xeno、timers\u rtpreempt、timers\u unix、unix 这是我的简历: cmake_minimum_required(VERSION 2.4.6) project(ikarus_arm_common C CXX) #set the defaul
can\u socket、can\u virtual、timers\u xeno、timers\u rtpreempt、timers\u unix、unix
这是我的简历:
cmake_minimum_required(VERSION 2.4.6)
project(ikarus_arm_common C CXX)
#set the default path for built executables to the "bin" directory
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set the default path for built libraries to the "lib" directory
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
find_package(Boost COMPONENTS filesystem system serialization REQUIRED)
set(CAN_MASTER_INCLUDE_DIR include)
include_directories( ${Boost_INCLUDE_DIRS}
${CAN_MASTER_INCLUDE_DIR}
${CAN_MASTER_INCLUDE_DIR}/boost
${CAN_MASTER_INCLUDE_DIR}/timers_rtpreempt
${CAN_MASTER_INCLUDE_DIR}/timers_unix
${CAN_MASTER_INCLUDE_DIR}/timers_xeno
${CAN_MASTER_INCLUDE_DIR}/unix
/usr/xenomai/include
)
set(CAN_FESTIVAL_CPP drivers/unix/unix.c
drivers/timers_xeno/timers_xeno.c
drivers/can_socket/can_socket.c
)
add_library(canfestival ${CAN_FESTIVAL_CPP})
编辑:
当我尝试编译时,它返回以下错误:
> $ make
> [ 9%] Building C object
> CMakeFiles/canfestival.dir/drivers/unix/unix.o
> In file included from
> /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/include/can.h:28:0,
> from /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/include/canDispatch.h:23,
> from /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/unix/unix.c:36:
> /usr/include/boost/function.hpp:13:57: fatal error: functional: No
> such file or directory compilation terminated. make[2]: ***
> [CMakeFiles/canfestival.dir/drivers/unix/unix.o] Error 1 make[1]: ***
> [CMakeFiles/canfestival.dir/all] Error 2 make: *** [all] Error 2
我认为其中一个问题是由于某些文件的扩展名为.c
,但需要boost。如果修改文件unix.cpp和can_socket.cpp
的扩展名,而timers\u xeno
返回错误:
luca@luca-vmware:~/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/build$ make
[ 9%] Building CXX object CMakeFiles/canfestival.dir/drivers/unix/unix.o
[ 18%] Building CXX object CMakeFiles/canfestival.dir/drivers/timers_xeno/timers_xeno.o
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp: In function ‘void CreateReceiveTask(CAN_PORT, pthread_t*, void (*)(void*))’:
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:250:75: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_create(RT_TASK*, const char*, int, int, int)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:256:70: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_start(RT_TASK*, void (*)(void*), void*)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp: In function ‘void WaitReceiveTaskEnd(pthread_t*)’:
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:270:38: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_join(RT_TASK*)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:273:36: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_delete(RT_TASK*)’
make[2]: *** [CMakeFiles/canfestival.dir/drivers/timers_xeno/timers_xeno.o] Error 1
make[1]: *** [CMakeFiles/canfestival.dir/all] Error 2
make: *** [all] Error 2
< >我如何解决这个问题?< /p>如果代码作者将这些文件编译成C,则不应该将它们编译为C++。当这些文件具有
.c
扩展名时,会出现什么问题?@arrowdoger请查看更新的问题。我插入了你需要的信息。这是作者代码的问题。问他为什么在C源中包含C++头。@ ARRODODGER是的,但问题是,为什么它用MaFag文件编译而不是用CMake编译??您可以尝试比较用于编译该源代码的命令行。对于CMake,请使用使VERBOSE=1
。