前言:我只说本地编译,不说安装项目。这是因为我还没有对installCMake进行足够的研究,但如果我的问题与install实践直接相关(似乎很可能),请加入。
在什么情况下,你不希望收集所有项目库正在兴建到同一个目录?为什么没有任何人曾经CACHE的CMAKE_*_OUTPUT_DIRECTORY路径?
是否需要$<CONFIG>直接执行电平规范?
一般默认值应该是CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, 还是PROJECT_BINARY_DIR?
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Run Code Online (Sandbox Code Playgroud)
您可以在网络上的许多项目中看到。
CMakeLists.txt 不能覆盖这些。所以建议的修订是始终 CACHE PATH "description":
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled static libraries.")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled shared libraries.")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Where to place compiled executables.")
Run Code Online (Sandbox Code Playgroud)
file_ops.hpp假设我有一个看起来像这样的头文件
#pragma once
bool systemIsLittleEndian() {
uint16_t x = 0x0011;
uint8_t *half_x = (uint8_t *) &x;
if (*half_x == 0x11)
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
我最初认为这与实现有关,但事实证明,我会得到重复的符号
#pragma once
bool systemIsLittleEndian() { return true; }
Run Code Online (Sandbox Code Playgroud)
如果我成功了inline,链接器错误就会消失。这不是我想要依赖的东西,因为这inline是请求而不是保证。
是什么导致了这种行为?我不是在处理返回某种单例的情况。
还有其他方法被标记为
bool MY_LIB_EXPORT someFunc();// implemented in `file_ops.cpp`
Run Code Online (Sandbox Code Playgroud)
这些是否以某种方式相关(混合导出函数和“普通旧函数”)?显然我可以将实现移至file_ops.cpp,我对为什么会发生这种情况很感兴趣。
我有以下结构
project_root/
CMakeLists.txt (A)
ext/
CMakeLists.txt (B)
apps/
CMakeLists.txt (C)
Run Code Online (Sandbox Code Playgroud)
仅当添加这个新的“配置样式”库时,设置似乎才是根本问题。
TL;DR:当find_package(foo)(B) 中定义foo::foo为库时,如何foo::foo在父范围中提供该库,以便它target_link_libraries(tgt foo)适用于 (A) 和 (C)?
add_subdirectory(ext)发生,并找到所需的外部库。add_subdirectory它们是和的混合物find_package。列表 (B) 填充额外包含目录、库和编译时定义的列表,使它们可供 (A)(以及随后的 (C))使用
set(MYPROJ_EXTRA_INC_DIRS "${MYPROJ_EXTRA_INC_DIRS}" PARENT_SCOPE)
set(MYPROJ_EXTRA_LIBS "${MYPROJ_EXTRA_LIBS}" PARENT_SCOPE)
set(MYPROJ_EXTRA_DEFINES "${MYPROJ_EXTRA_DEFINES}" PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)列表(A)现在添加了我的库,包括这些额外的目录,添加这些额外的定义,最终
target_link_libraries(${MYPROJ_LIB_NAME} ${MYPROJ_EXTRA_LIBS})
Run Code Online (Sandbox Code Playgroud)当请求构建应用程序时,add_subdirectory(apps)列表 (C) 会定义一个简单的宏,该宏使用指定的依赖项创建可执行文件。相关部分
target_link_libraries(${appName} ${MYPROJ_LIB_NAME} ${MYPROJ_EXTRA_LIBS})
Run Code Online (Sandbox Code Playgroud)长期以来,这种方法一直运作良好。但是,我添加了对使用配置样式find_package定义的新库的支持,但我不知道如何正确使用它。
将此新库称为依赖项foo。它最终定义了一个单一的foo_LIBRARY,即foo::foo. 我的理解是我需要这样做target_link_libraries(tgt foo),它适用于我的图书馆的列表(A)。但是,它不适用于应用程序,并且在宏中我必须find_package(foo)对每个可执行文件再次执行此操作。
有没有一种方法可以使用现有的方法(list(APPEND MYPROJ_EXTRA_LIBS <something>) …
static具有(i)模板和(ii)类本身作为参数的模板类的方法没有错,是吗?考虑上课
template<class Projection>
struct FrameData {
// ...
template <bool devPtr>
static void allocate(FrameData<Projection> &data) {
// ... do allocations ...
}
}
Run Code Online (Sandbox Code Playgroud)
这是在文件头中声明的A.在世界的其他地方,我有类似的东西
template <class Projection>
void some_method(FrameData<Projection> &m_data) {
FrameData<Projection>::allocate<true>(m_data);
}
Run Code Online (Sandbox Code Playgroud)
我结束了一些
error: reference to overloaded function could not be resolved; did you mean to call it?
Run Code Online (Sandbox Code Playgroud)
.template对于像这里的答案这样的static方法,是否存在某种类似的魔法?FrameData<Projection>是问题吗?它尚未完全定义?在这个世界的其他地方技术上是在一个源文件中,底部有一些明确的实例化,但是我将这一切都放在一个文件中,并且具有相同的错误.感谢您的任何见解,请不要在非标头模板上羞辱我.这不是我的选择.
我在使用 AVX2 进行图像转换时看到了这个很棒的答案__m128i,并且认为我会尝试使用 AVX2 来看看是否可以更快地获得它。该任务是获取输入 RGB 图像并将其转换为 RGBA(注意另一个问题是 BGRA,但这并不是一个很大的区别......)。
如果需要,我可以包含更多代码,但是这些东西变得非常冗长,而且我陷入了看似非常简单的事情。假设对于此代码,所有内容都是 32 字节对齐、使用-mavx2等进行编译。
给定输入uint8_t *sourceRGB 和输出uint8_t *destinationRGBA,它会像这样(只是尝试用条纹填充图像的四分之一 [因为这是矢量土地])。
#include <immintrin.h>
__m256i *src = (__m256i *) source;
__m256i *dest = (__m256i *) destination;
// for this particular image
unsigned width = 640;
unsigned height = 480;
unsigned unroll_N = (width * height) / 32;
for(unsigned idx = 0; idx < unroll_N; ++idx) {
// Load first portion and fill all of dest[0]
__m256i …Run Code Online (Sandbox Code Playgroud)