在我的项目中,我有一个CMakeLists.txt
定义了一些可执行文件的根目录。我用来target_compile_options
配置一些设置,例如这些可执行文件的警告。我有一些子目录编译一些库以与可执行文件链接。如何将编译选项从根目录传播CMakeLists.txt
到子目录中的依赖项,而无需重新定义每个子目录中的编译选项CMakeLists.txt
?
作为示例,这是我的 root 的简化版本CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(proj)
enable_language(C ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
add_subdirectory(src/lib/somelib)
add_executable(my_executable src/app/main.c)
target_compile_options(my_executable PUBLIC -Wpedantic) # as an example
target_link_libraries(my_executable PRIVATE somelib)
Run Code Online (Sandbox Code Playgroud)
和CMakeLists.txt
在src/lib/somelib
add_library(somelib somelib.c)
target_include_directories(somelib PUBLIC .)
Run Code Online (Sandbox Code Playgroud)
在此示例中,我希望somelib.c
使用 root 中的任何编译选项进行编译CMakeLists.txt
。
我使用库类型创建了一个具有一些嵌套库依赖项的项目OBJECT
。这样做的动机是为了避免静态库的链接顺序问题。
我有一个简单的目录结构如下:
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar.c\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.c\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.c\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n
Run Code Online (Sandbox Code Playgroud)\nfoo
取决于bar
,并且main
取决于foo
。例如,
酒吧.c
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar.c\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.c\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.c\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n
Run Code Online (Sandbox Code Playgroud)\nfoo.c
\n#include "bar.h"\n\n#include <stdio.h>\n\nvoid bar(void) {\n printf("woot woot\\n");\n}\n
Run Code Online (Sandbox Code Playgroud)\n主程序
\n#include "foo.h"\n\n#include "bar.h"\n\nvoid foo(void) {\n bar();\n}\n
Run Code Online (Sandbox Code Playgroud)\nCMakeLists.txt
\n#include "foo.h"\n\nint main() {\n foo();\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n我的期望是,当它链接到它时myexe
,它会继承bar
依赖关系foo …
这感觉像是一个基本问题,但到目前为止我找不到明确的答案。
我想实现一个高效的函数round_to_nearest(int x, int multiple)
,将有符号整数四舍五入x
到最接近的倍数multiple
,尽可能避免使用浮点算法。
示例输出:
round_to_nearest(14, 5);
15
round_to_nearest(16, 5);
15
round_to_nearest(23, 5);
25
round_to_nearest(22, 5);
20
round_to_nearest(-23, 5);
-25
round_to_nearest(-22, 5);
-20
Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经看到INTERFACE
用于描述仅标头库的库类型,因为它不编译源代码并且不生成库工件。我见过的库类型IMPORTED
较少,但从我读到的内容来看,它用于描述已经在磁盘上的预编译库。
我最近看到一些带有IMPORTED INTERFACE
库类型的代码,并且对为什么使用它感到困惑。这种类型有哪些属性,这种类型的一些典型用例是什么?