小编sve*_*evs的帖子

CMAKE_*_OUTPUT_DIRECTORY 的正确使用

前言:我说本地编译,说安装项目。这是因为我还没有对installCMake进行足够的研究,但如果我的问题与install实践直接相关(似乎很可能),请加入。

TL; 博士

  1. 在什么情况下,你希望收集所有项目库正在兴建到同一个目录?为什么没有任何人曾经CACHECMAKE_*_OUTPUT_DIRECTORY路径?

  2. 是否需要$<CONFIG>直接执行电平规范?

  3. 一般默认值应该是CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, 还是PROJECT_BINARY_DIR

1.缓存还是不缓存?

这个优秀的答案

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)
  • 有什么理由 …

c++ cmake

5
推荐指数
1
解决办法
2861
查看次数

头文件中定义的函数的重复符号

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,我对为什么会发生这种情况很感兴趣。

header-files c++11

4
推荐指数
1
解决办法
4572
查看次数

“config-style”cmake find_package 在父范围中不可用

我有以下结构

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)?

  1. 列表 (A) 定义了我的项目的选项,例如要编译支持哪些驱动程序。
  2. 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)
  3. 列表(A)现在添加了我的库,包括这些额外的目录,添加这些额外的定义,最终

    target_link_libraries(${MYPROJ_LIB_NAME} ${MYPROJ_EXTRA_LIBS})
    
    Run Code Online (Sandbox Code Playgroud)
  4. 当请求构建应用程序时,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>) …

cmake

2
推荐指数
1
解决办法
2065
查看次数

以类为参数调用模板类的静态模板方法

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>是问题吗?它尚未完全定义?

在这个世界的其他地方技术上是在一个源文件中,底部有一些明确的实例化,但是我将这一切都放在一个文件中,并且具有相同的错误.感谢您的任何见解,请不要在非标头模板上羞辱我.这不是我的选择.

c++ templates class c++11

1
推荐指数
1
解决办法
536
查看次数

带有 __256i 向量的意外 _mm256_shuffle_epi

我在使用 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)

c++ intrinsics avx avx2

1
推荐指数
1
解决办法
1098
查看次数

标签 统计

c++ ×3

c++11 ×2

cmake ×2

avx ×1

avx2 ×1

class ×1

header-files ×1

intrinsics ×1

templates ×1