相关疑难解决方法(0)

如何在我的Linux主机上安装Raspberry Pi交叉编译器?

我正在尝试为我的Ubuntu机器上的Raspberry Pi进行交叉编译.

在我最初的尝试中,我使用的是arm-linux-gnueabi编译器,它可以在Ubuntu repo中找到.我得到了这个工作.我能够构建所有依赖项并在我的cmake项目中使用交叉编译器.

但是,我相信我应该使用hf版本,所以我切换到arm-linux-gnueabihf.然后我意识到这不适用于Raspberry Pi,因为它是armv6.

经过一些谷歌搜索后,我找到了GitHub预先构建的工具链.

我下载了工具链,但我真的不明白如何"安装"它.我将文件解压缩到我的主目录.目录结构如下所示:

/gcc-linearo-arm-linux-gnueabihf-raspbian
    /arm-linux-gnueabihf
        /bin
            (contains g++, gcc, etc)
        /lib
            (contains libstdc++ library)
    /bin
        (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
    /lib
        (gcc lib stuff)
Run Code Online (Sandbox Code Playgroud)

如果我将目录更改为INNER bin文件夹,我可以从终端编译测试程序,没有任何问题.

~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Run Code Online (Sandbox Code Playgroud)

然后我尝试在OUTER bin文件夹中编译测试程序,该文件夹包含工具的前缀版本.

 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
 arm-linux-gnueabihf-g++ test.cpp -o test
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用编译器时(从内部bin目录之外),它无法找到工具链附带的libstdc ++共享库:

arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

此外,我希望能够使用编译器而无需导航到bin目录.所以我尝试添加OUTER bin目录(因为我想要前缀版本)和两个lib目录到我的PATH:

export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Run Code Online (Sandbox Code Playgroud)

但是,这会导致相同的错误.我应该如何"安装"工具链,以便我可以随处使用工具链,就像我使用Ubuntu repo中的交叉编译器一样?

c++ linux arm cross-compiling raspberry-pi

107
推荐指数
4
解决办法
12万
查看次数

CMakeLists.txt上的CMake错误:30(项目):找不到CMAKE_C_COMPILER

我正在尝试用CMake制作一个Visual Studio解决方案来编译最新版本的aseprite并且CMake一直给我:

No CMAKE_C_COMPILER could be found.
No CMAKE_CXX_COMPILER could be found.
Run Code Online (Sandbox Code Playgroud)

我已经下载了GCC,我正在使用Visual Studio 2015.

我正在学习本教程:

https://github.com/aseprite/aseprite/blob/master/INSTALL.md

c++ gcc cmake visual-studio visual-studio-2015

90
推荐指数
7
解决办法
23万
查看次数

CMake:如何指定要使用的Visual C++版本?

我安装了多个版本的Visual Studio(2010,2012,2015试用版).

如何强制CMake为特定的VS版本生成makefile?默认情况下,它为VS2015生成.

version cmake visual-studio visual-c++

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

在CMake中更改CMAKE_CXX_FLAGS_DEBUG和朋友的默认值

我想改变的默认值CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS_DEBUG在CMake的.基本上,我有一些项目默认值与CMake略有不同(例如发布),我不应该问自己"哦,当添加add_compile_options时,他们的-O3或我们的-O2优先."

现在,我知道如何设置这些值,但我不知道如何使用户可以通过两种常用方式进行编辑:DCMAKE_CXX_FLAGS_DEBUG=yourflags在命令行上使用 - 或者使用ccmake或CMakeSetup配置它.

问题是CMAKE为这些设置和缓存它们自己的默认值,如果你试图在不使用FORCE的情况下覆盖变量,那么"默认值"永远不会改变.如果我在set命令中使用FORCE:set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE)它会在每次运行脚本时覆盖它,从而消除了用户根据需要进行更改的可能性.

我设法通过执行以下操作来破解它与CCMAKE一起工作,但是这仍然不起作用,cmake -DCMAKE_CXX_FLAGS_DEBUG因为它覆盖用户更改后完成它:

set(DEFAULTS_SET FALSE CACHE BOOL "")
set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE)
set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE)
Run Code Online (Sandbox Code Playgroud)

显然,这是一个讨厌的黑客,并没有完全工作(在cmake -Dwhatever = thisorthat的情况下).我也可以添加其他构建类型,但我真的不明白为什么只需更改一些简单的东西就是必要的.

编辑2015年3月1日:

我已经创建了一个有效的解决方案,尽管我仍然对我必须做的事情感到非常激动.我看到其他评论解决了设置CMAKE_CXX_FLAGS_DEBUG和朋友的问题而没有让他们受到破坏,但这最初对我不起作用,因为我试图根据正在使用的编译器选择它们.但是,在它已经为我填充变量之前,编译器尚未确定.我使用的技巧如下.您必须在项目命令之前将flags变量设置为'special'.

set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "")
project(your_project C CXX)

if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET")
    # Do some compiler switching here and then set your flags with FORCE.
    set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE)
endif() …
Run Code Online (Sandbox Code Playgroud)

c++ cmake compiler-optimization

9
推荐指数
2
解决办法
9570
查看次数

从makefile到CMake的通用规则

我试图将流动的vanilla makefile行"转换"为CMake语法.

SRCS = $(wildcard *.foo)
OBJS = $(SRCS:.foo=.bar)

my_rule: $(OBJS)

%.bar: %.foo
    make_bar_from_foo  $@  $<
Run Code Online (Sandbox Code Playgroud)

工作丑陋的尝试

FILE(GLOB SRCS "*.foo")
SET(outFiles)
FOREACH(SRC ${SRCS})
    SET(OUTPUT_FILE_NAME "${SRC}.bar")

    ADD_CUSTOM_COMMAND(
      OUTPUT "${OUTPUT_FILE_NAME}"
      COMMAND make_bar_from_foo ${SRC} ${OUTPUT_FILE_NAME}
      DEPENDS "${SRC}")

    SET(outFiles ${outFiles} "${OUTPUT_FILE_NAME}")
ENDFOREACH(SRC)
ADD_CUSTOM_TARGET(my_rule ALL DEPENDS ${outFiles})
Run Code Online (Sandbox Code Playgroud)

我知道它会为每个文件生成一个命令而不是通用的.最简单/最干净的方法吗?

makefile cmake

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

在"配置"步骤完成之前,在CMake中执行命令或宏作为最后一步

在配置阶段结束之前,CMake(版本> = 2.8.7)以某种方式执行宏或命令作为最后一步吗?

应在屏幕上打印以下行之前执行该功能:

-- Configuring done
-- Generating done
Run Code Online (Sandbox Code Playgroud)

到现在为止我没能找到这可以作为一个依赖与实现这个目标的CMake add_custom_command add_custom_targetadd_dependencies.

编辑:我们有一个库导出几个CMake宏,其中一些宏必须在CMakeLists.txt运行所有其他CMake命令后在每个文件的末尾执行.理想情况下,可以通过在文件macros.cmake中包含CMakeLists.txt文件来实现所需的行为,而无需在此CMakeLists.txt文件的末尾添加其他命令.

也可以通过收集一个宏中的所有功能来实现这一点,这个宏需要在结束时显式调用CMakeLists.txt.但是,已经有几个依赖库需要进行调整,这个问题的解决方案将省略这项额外的工作.此外,添加宏可能会被遗忘,或者可能很容易违反对最后一个语句的要求.

示例macros.cmake:

macro(FINAL_MACRO)
    message(STATUS "Last step before finishing Configure phase")
endmacro()

# HERE: something like add_custom_target(final_steps)
# followed by something like add_dependencies(final_steps cmake_configure_finished)
Run Code Online (Sandbox Code Playgroud)

示例顶级CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.7)
include(macros.cmake)

add_subdirectory(source)
add_subdirectory(interfaces)

# Here FINAL_MACRO should get executed without explicitly writing it down
Run Code Online (Sandbox Code Playgroud)

如果没有其他选项,我们将不得不要求每个用户在其CMakeLists.txt文件末尾调用一个特殊的宏.

cmake

8
推荐指数
2
解决办法
4166
查看次数

如何在CMake中指定编译器?

我想使用IAR编译器.我注意到CMake已经有一堆关于这个编译器的文件:

https://github.com/jevinskie/cmake/blob/master/Modules/Compiler/IAR.cmake

从我读到的常见解决方案是手动指定我的所有工具链CMakeLists.txt:

set(CMAKE_C_COMPILER iccarm)
set(CMAKE_CPP_COMPILER iccarm)
Run Code Online (Sandbox Code Playgroud)

CMake如何将这些定义与`Modules/Compiler/IAR.cmake"联系起来?

我以为我只需要这样做

include("Modules/Compiler/IAR.cmake")
Run Code Online (Sandbox Code Playgroud)

指定IAR编译器的正确方法是什么?

当我做

cmake .
Run Code Online (Sandbox Code Playgroud)

它仍然试图使用gcc而不是我的IAR编译器.为什么?

cmake iar

7
推荐指数
4
解决办法
9970
查看次数

使用特定链接器进行CMake交叉编译不会将参数传递给armlink

我正在尝试交叉编译嵌入式ARM Cortex构建的项目,但我无法使链接器正常工作.我想使用armlink,但没有文件传递给armlink,因此没有生成.elf文件.

我的CMakeLists.txt非常简单,如下所示.之后显示失败,表明makefile在没有任何参数的情况下调用了armlink.

任何指针都会有所帮助 - 我搜索并阅读了很多帖子,但他们似乎都有更多的参与要求.

cmake_minimum_required(VERSION 2.8)

project(test_arm)
enable_language(C ASM)

# Cross-compilation for ARM
SET(CMAKE_C_COMPILER armcc)
SET(CMAKE_LINKER armlink)
SET(CMAKE_C_LINK_EXECUTABLE armlink)

SET(CMAKE_C_FLAGS "--cpu=Cortex-M3")
SET(LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")
SET(CMAKE_EXE_LINKER_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")

include_directories(../include)

add_executable(blinky blinky.c)
set_target_properties(blinky PROPERTIES LINKER_LANGUAGE C)
Run Code Online (Sandbox Code Playgroud)

失败如下,但我想对于我的CMakeLists中有一些愚蠢问题的人来说很明显:

$ make VERBOSE=1
[100%] Building C object CMakeFiles/blinky.dir/blinky.c.o
/usr/bin/cmake -E cmake_link_script CMakeFiles/blinky.dir/link.txt --verbose=1
armlink
Linking C executable blinky
Product: DS-5 Professional 5.21.0 [5210017]
Component: ARM Compiler 5.05 update 1 (build 106)
Tool: armlink [4d0efa]
For support see …
Run Code Online (Sandbox Code Playgroud)

c linker cmake cross-compiling

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

CMake在不同的构建目录中构建多个目标

我有以下CMake结构:

CMakelists.txt
toolchain.cmake
folder1
   ----CMakelists.txt
folder2
   ----CMakelists.txt
etc..
Run Code Online (Sandbox Code Playgroud)

我的第一级CMakelists.txt文件包含其他子目录.现在我想为不同的目标构建我的代码.

手动方式是:

1.
    mkdir hostBuild
    cd hostBuild
    cmake ..
    make

2.
    mkdir crossBuild
    cd crossBuild
    cmake .. --DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
    make
Run Code Online (Sandbox Code Playgroud)

这个过程可以自动运行吗?

例如,我只需要cmake .在我的第一级运行.

这样的事情有可能吗?

c++ cmake

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

CMake和Make需要运行两次才能成功构建代码

我在C ++ 14项目中使用CMake 3.8.2,GNU make 4.2.1和GCC 6.4.0,在构建时我注意到了一个奇怪的行为。我使用CMake在名为“ build”的子文件夹中进行源代码外构建,cmake ..然后运行make

CMake运行良好,没有任何错误,make会像我期望的那样构建所有源文件,直到完成编译并开始链接它们为止。然后它将失败并显示错误

[ 83%] ...
[100%] Linking CXX executable myproject
/usr/bin/ld: some-source-file.cc.o: undefined reference to symbol '_ZNKSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4.21'
Run Code Online (Sandbox Code Playgroud)

有趣的是,到目前为止,它不显示任何编译器警告,而仅显示上述链接器错误。

现在,当我忽略该错误并简单地运行cmake ..,然后make再次运行(就像我之前所做的那样)时,即使我没有更改任何代码或与CMake相关的文件,我也会得到我的代码应产生的所有编译器警告,并且所有链接都可以正常运行同时。

我可以build通过运行删除目录中的所有文件来重现此行为rm -r *

这是我的CMakeLists.txt文件:

# Define minimum required CMake version
cmake_minimum_required(VERSION 3.8.2)

# Setting compiler related settings
set(CMAKE_CXX_COMPILER "${CMAKE_SOURCE_DIR}/toolchain/binary/gcc-6.4.0/bin/gcc")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion -O2 -lstdc++")
set(CMAKE_CXX_STANDARD 14)

# Define project name
project(MyProject)

# Find source files
file(GLOB_RECURSE …
Run Code Online (Sandbox Code Playgroud)

c++ gcc cmake gnu-make

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