c++ - 如何在 CMake 中编译非通用语言
问题描述
我正在尝试为我的一个项目从 Makefile 切换到 CMake。问题是在编译步骤中,我使用了非通用语言编译器(Futhark)来生成 .c 和 .h 文件。Makefile 的相关部分如下所示。
fut_compile: futhark/select_where.fut
mkdir -p build && futhark c --library futhark/select_where.fut -o build/select_where
fut_shared_lib: build/select_where.c build/select_where.h
gcc build/select_where.c -o build/lib_select_where.so -fPIC -shared
# Generate output directory
fut_result: build/lib_select_where.so db_gpu_load.cpp CLI.cpp
g++ -std=c++11 build/lib_select_where.so db_gpu_load.cpp CLI.cpp -o build/out
我想 CMake 文件看起来像这样:
# ??
# ?? futhark c --library futhark/select_where.fut -o build/select_where
# ??
add_library(mylib SHARED
build/select_where.c
build/lib_select_where.so
)
add_executable(Exe CLI.cpp db_gpu_load.cpp)
TARGET_LINK_LIBRARIES(Exe LINK_PUBLIC mylib)
是否有标准为什么要添加生成源文件和头文件的非标准语言的编译,然后在 CMake 中生成共享库时包含这些文件?我对 CMake 非常陌生,因此将不胜感激任何帮助。
解决方案
像这样做:
// build/select_where.c build/select_where.h: futhark/select_where.fut
// mkdir -p build && futhark c --library futhark/select_where.fut -o build/select_where
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/select_where.c
${CMAKE_CURRENT_BINARY_DIR}/select_where.h
COMMAND futhark c
--library futhark/select_where.fut
-o ${CMAKE_CURRENT_BINARY_DIR}/select_where
DEPENDS futhark/select_where.fut
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)
// build/lib_select_where.so: build/select_where.c build/select_where.h
// gcc build/select_where.c -o build/lib_select_where.so -fPIC -shared
add_library(select_where SHARED
${CMAKE_CURRENT_BINARY_DIR}/select_where.c
${CMAKE_CURRENT_BINARY_DIR}/select_where.h
)
// maybe target_include_diresctories(select_where PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
// so that selct_where.h is visible, dunno
// build/out: build/lib_select_where.so db_gpu_load.cpp CLI.cpp
// g++ -std=c++11 build/lib_select_where.so db_gpu_load.cpp CLI.cpp -o build/out
add_executable(out
db_gpu_load.cpp
CLI.cpp
)
target_link_libraries(out PRIVATE
select_where
)
set_target_properties(out PROPERTIES
CMAKE_CXX_STANDARD CXX11
CMAKE_CXX_STANDARD_REQUIRED TRUE
)
推荐阅读
- python-3.x - 检查字符串是否是对象变量的一部分
- ios - 不要成功地从 Xcode 运行 react native 应用程序(从 cli 运行相同的应用程序就可以了)
- sql - 如果表包含 STRUCT 类型,则 BigQuery 中两个表的通用比较方法
- swiftui - 将来自 url 的 Image() 放入 List 内 Button 内的 HStack 使其变黑
- android - 如何修复Android项目上的链接错误
- python - Array Division Linear Least lstsq 给出错误的结果
- c++ - 纯抽象类的虚拟析构函数
- powershell - 无法使用 Send-MailMessage 发送附件
- c - 马里奥问题集 - 为什么不打印哈希?
- sql-server - IntegrationServicesCatalog 不允许创建 SSISDB