标签: cmake

C - 编译器允许的语法无效?

当我使用Microsoft Visual Studio学习C时,它不允许我创建一个非常大小的数组.我不得不把价值int arr[5];或者做#define size 5或做int arr[size];.但是今天使用Clion,我注意到它允许我执行以下操作:

#include <stdio.h>

int main()
{
    printf("Enter a value: ");
    int x;
    scanf("%d", &x);

    int arr2[x];
    for (int i = 0; i < x; i++)
    {
        arr2[i] = i;
        printf("Array at %d is %d.\n", i, arr2[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个C代码编译和运行没有任何问题 - 没有段错误或任何东西.这是怎么回事?这是合法的C代码,我刚刚在一个不允许它的IDE中学习过,或者这是无效的C代码而我只是使用了一个糟糕的编译器?在我使用Linux的另一台计算机上,我甚至安装了GCC 7.2,并且允许使用相同的语法.我不明白.这是一个CLion问题,CMake问题还是C lang问题?

我的编译器和CMake如下所示.谢谢.

在此输入图像描述

c cmake clion

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

为UWP构建OpenCV

我目前正在努力为UWP构建OpenCV.

我已经搜索了很多东西,并发现微软的OpenCV Github Repo技术应该做到这一点.然而,这个回购以及我在这方面发现的其他所有东西都已经过时(Visual Studio 2015,旧的OpenCV版本等).我需要使用OpenCV 3.3,因为它是一个跨平台项目,我不想仅仅因为过时的git repo而重新编译其他所有内容.

任何人都可以解释使用CMake从UWP官方回购中构建OpenCV的过程吗?


我的第一次尝试是简单地使用Windows Dll,但是我的应用程序不会向我喊"无法加载模块".然后,我尝试构建OpenCV Visual Studio项目文件,如此此处所述.但是,这不适合我,因为它会抛出以下错误:

cmake/OpenCVUtils.cmake上的CMake错误:440(如果):如果给定参数:

"(" "OR" "OFF" ")"
Run Code Online (Sandbox Code Playgroud)

指定了未知参数调用堆栈(最近一次调用):CMakeLists.txt:317(OCV_OPTION)

它还告诉我检查CMakeOutput.log但是到处都是0错误.

如果有人能告诉我如何摆脱这个错误或者在CMake GUI中为了为UWP构建OpenCV需要改变什么,那就太好了!

编辑:

我还尝试使用平台特定的WinRT工具链编译OpenCV,如平台/ winrt中所示.它并没有真正改变任何东西(我甚至不确定它是否应该),我仍然得到"无法加载Dll:无法找到指定的模块".也许GPPK在他的假设中是正确的,它更像是UWP问题,而不是OpenCV问题.无论如何,如果有人对此有所了解,我真的很想得到一些帮助!

c++ opencv cmake uwp

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

使用mingw和cmake构建opencv时出错:"windres.exe:invalid option - W"

我正在尝试使用mingw和cmake构建opencv 3.4源代码.我已经使用cmake配置和生成,然后使用admin powershell,我mingw32-make.exe在cmake中选择的构建目录中运行

以下是输出的最后几行:

在此输入图像描述

opencv mingw cmake windows-10

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

使用&lt;target_compile_feature&gt;或&lt;set(CMAKE_CXX_STANDARD)&gt;激活C ++ 11

我正在使用一个名为PyPHS的Python库,该库专门用于物理建模。为了节省仿真期间的计算量,它实现了C ++代码生成功能。它使用CMake生成特定模拟的可执行文件。

它在C ++ 11中实现。


问题

在CMakeLists.txt文件中,以下行激活了C ++ 11功能:

target_compile_features(<project_name> PUBLIC cxx_std_11)
Run Code Online (Sandbox Code Playgroud)

在我的计算机(CMake 3.5.1和Ubuntu 16.04.4 Xenial Xerus)上,CMake引发错误:此功能未知:

-- The CXX compiler identification is GNU 5.4.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:31 (target_compile_features):
  target_compile_features specified unknown feature "cxx_std_11" for …
Run Code Online (Sandbox Code Playgroud)

c++ cmake c++11

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

CMake将来自不同CMakeLists.txt的对象附加到一个库中

我想从多个子目录中的对象创建一个库,每个子库包含自己的CMakeLists.txt和OBJECT库技巧,以使多个目标具有不同的编译选项。

这些是文件:

project_dir
|--- subdir1
|    |--- src1.c
|    |--- CMakeLists.txt
|--- subdir2
|    |--- src2.c
|    |--- CMakeLists.txt
|--- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

所有CMakeLists.txt的内容

// project_dir/CMakeLists.txt
// what to put here? to make one single library (mainLib)


// project_dir/subdir1/CMakeLists.txt
add_library(lib11 OBJECT src1.c)
set_target_properties(lib11 PROPERTIES COMPILE_FLAGS "some-flags11")

add_library(lib12 OBJECT src1.c)
set_target_properties(lib12 PROPERTIES COMPILE_FLAGS "some-flags12")
// here I would like to add lib11:objects and lib12:objects to mainLib
// how should it be done?

// project_dir/subdir2/CMakeLists.txt
// *** similar to subdir1 but with src2.c that …
Run Code Online (Sandbox Code Playgroud)

linker build cmake unix-ar

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

Cuda CMake 3.10 CMakeLists.txt

我有一个可视化的c ++项目,它创建了一个dll.对于这个项目,我有一个工作的CMakeLists.txt.

现在我创建了两个完成项目的cuda源文件,并且使用visual studio,构建工作正常.我想将匹配的命令添加到我的cmake文件中.谁能告诉我需要添加的基本命令?

我尝试构建一个dll库,其中我使用.cu和.cpp文件....我的cmake文件的重要部分如下所示:

# ----------------------------------------------------------------------------
# Set Cuda properties
# ----------------------------------------------------------------------------
enable_language(CUDA)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
  set(CUDA_64_BIT_DEVICE_CODE_DEFAULT ON)
endif()
set(CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;-rdc=true;-use_fast_math")

message(STATUS "CUDA_PROPAGATE_HOST_FLAGS: ${CUDA_PROPAGATE_HOST_FLAGS}")
message(STATUS "CUDA_HOST_COMPILER: ${CUDA_HOST_COMPILER}")
message(STATUS "CUDA_NVCC_FLAGS: ${CUDA_NVCC_FLAGS}")

# ----------------------------------------------------------------------------
# Create shared library project
# ----------------------------------------------------------------------------
add_library(${LIB_NAME} SHARED ${HEADERS} ${SOURCES} ${CUDA_SOURCES})
set(CUDA_LIBRARIES "cudadevrt.lib;cudart.lib")
target_link_libraries(${LIB_NAME} ${CUDA_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

但它没有使用正确的标志编译cuda文件.同样在visual studio中,预处理器定义也在属性的cuda部分....任何建议?

cuda cmake

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

具有CMakeLists.txt的C ++ AddressSanitizer导致asan错误

尝试在我的C ++项目中使用AddressSanitizer工具(ASan),我得到了一个非常冗长的输出,其中包含undefined reference to '__asan_report_store8'undefined reference to '__asan_report_load8',以及其他类似的内容__asan_stack_malloc_2。我的项目是使用CMake构建的,并且已将以下行添加到CMakeLists.txt中:

add_definitions(-fsanitize=address -g3 -fno-omit-frame-pointer)
Run Code Online (Sandbox Code Playgroud)

遵循以下ASan示例:

运行上面的makefile示例,我得到了预期的漂亮输出(也可以在视频链接中看到)。但是对于我的项目,我得到了这些错误的混乱堆栈跟踪。

笔记:

  • Ubuntu 16.04
  • 我已经设置了环境变量ASAN_OPTIONS=symbolize=1ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer以便在ASan输出中打印行号

c++ cmake address-sanitizer

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

如何解决此语句可能会失败[-Werror = implicit-fallthrough =]?

是什么

this statement may fall through [-Werror=implicit-fallthrough=]
Run Code Online (Sandbox Code Playgroud)

意思 ?

我在这样的语句编译时收到此错误:

switch(eT)
    {
    case SEL_CRIT:
        {
            TYPE1* psSel;
            iRetVal = dbseq(enB->m_ps,
                NULL, NULL, &esM, NULL, ESEC);
            while (iRetVal == 0)
            {
                if(psEnterprise)
                {
                    bool iFound = false;
                    for (i = 0; i< psME->m_pslave[0].m_uc; i++)
                    {
                        ENT node1;
                        sEOS = psME>m_pslave[0].m_pslavecnt[i];

                    }
                    if (iFound && (psME->m_NOTOVERLOADED == false))
                    {
                        return psME;
                    }
                }
            }
            psSel = (M_EN*)pCrit;
            LOG_INFO(FAIL_TO_LOAD, psME->m_ONG, psME->EN);
            int_Enterprise = NULL;
        }
Run Code Online (Sandbox Code Playgroud)

int_Enterprise = NULL;
Run Code Online (Sandbox Code Playgroud)

哪里

int_Enterprise是某种结构指针。

我怎样才能解决这个问题?

c c++ cmake

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

使用cmake交叉编译gRPC

我正在尝试使用cmake交叉编译gRPC。

我实际上做到了。不幸的是,我的方法涉及修补CMakeLists.txt。

问题是,当我尝试编译gRPC时,它使用的是他刚刚编译的protobuffer。它无法在x86计算机上运行ARM编译的可执行文件。

我设法通过在gRPCs主CMakeLists.txt中手动指定protoc和grpc_cpp_plugin的路径来编译它。它很脏,并且由于我想将gRPC作为子模块包括在内,因此我需要一种干净的方法来完成它。

有没有人设法使用cmake交叉编译gRPC?

c++ cmake cross-compiling grpc

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

用于CMake MSVC目标的设置/ PROFILE链接器标志

如何让CMake始终/PROFILERelWithDebInfoMSVC(17)目标设置/添加链接器标志?

cmake visual-studio

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