tl;dr 问题在底部。
我是一名尝试新事物的开发人员 - 我的最后一毒是 C++。由于我一半时间花在我的 linux 笔记本电脑上,另一半时间花在 Win XP PC 上,我试图找到一种方法来创建基本的准系统项目,使用良好的 c++ 实践(好吧,我从经验中不知道它们,我刚刚读到它们)。现在我的项目在使用 cmake 时几乎可以正常工作。 && make 在 linux 上(当头文件和源文件位于同一文件夹中时它有效,当我将它们分开以包含/src 文件夹时失败)。我在 Windows 上使用 nuwen 的 mingw 发行版(我知道工具链正在运行,它从 Eclipse 中编译项目没有任何问题)。
我的项目目录如下所示:
engine
|
|- main
|
|- include
|
|- App.h
|- CMakeLists.txt (2)
|- src
|
|- main.cc
|- App.cc
|- CMakeLists.txt (3)
|- CMakLists.txt (1)
文件的内容非常简单(为清楚起见,我将删除包含保护等)
应用.h:
class App {
public:
App();
int onExecute();
};
App.cc:
#include <iostream>
#include "App.h"
App::App() {
}
int App::onExecute() {
std::cout << "inside app.." << '\n';
return 0;
}
主.cc:
#include <iostream>
#include "App.h"
using namespace std;
int main(int argc, char* argv[]) {
App a;
a.onExecute();
std::cout << "inside main.." << '\n';
}
CMakeLists.txt (1) - 主要部分:
cmake_minimum_required (VERSION 2.6)
set (CMAKE_CXX_COMPILER "g++")
project (gameengine)
add_definitions ( "-Wall -ansi -pedantic")
add_subdirectory (${CMAKE_SOURCE_DIR}/main/include)
add_subdirectory (${CMAKE_SOURCE_DIR}/main/src)
add_executable (engine ${CMAKE_SOURCE_DIR}/main/src/main.cc)
target_link_libraries (engine Application)
CMakeLists.txt (2) - 在包含目录中
add_library (Application App)
set_target_properties (Application PROPERTIES LINKER_LANGUAGE CXX)
CMakeLists.txt (3) - src 目录内
include_directories (../include)
这就是我所得到的 - 通过一些更改(即将 App.cc 移动到 include 目录)整个东西在 linux 上编译和运行良好 - 但我无法让 mingw 生成器在 Win XP 上工作.我手动调整了文件 CMakeCache.txt 中的 CMAKE_MAKE_PROGRAM 以指向正确的 make.exe(我知道这应该定义为系统变量但是因为我在许多不同的 PC 上工作,我不想在之后留下垃圾我)。
我的问题是:
1) 编写多平台 CMakeLists.txt 文件的指南是什么(它将独立于操作系统和项目文件的位置工作),这最好能让我轻松地将我的项目配置从一个操作系统切换到另一个操作系统?
2) 如何解决找不到头文件的错误 (make gives: (...)\engine\main\src\main.cc:2:17: fatal error: App.h: No such文件或目录)?
感谢您的宝贵时间和帮助。
最佳答案
1) what are the guidelines for writing multiplatform CMakeLists.txt file (which will work independly of the os and the location of the project files), which preferably will allow me to easy swich my project configuration from one os the other one?
嗯,我当然不是专家,但我可以分享我 10 个月的跨平台基于 cmake 项目的经验。
马上我认为您真的应该使用源代码之外的构建。这意味着您不会在代码所在的同一目录中运行 cmake;相反,您创建一个新文件夹,例如engine/build然后运行 cmake ../main从那里。这样你就不会用 cmake 的东西破坏你的源文件,比如 CMakeCache.txt 等。你甚至可以使用一些宏来禁止你的用户进行源内构建。
我还发现创建一组宏文件有助于为不同平台设置编译器选项。在工作中,我们有诸如 ADD_GCC_FLAG 之类的宏。或 ADD_MSVC_FLAG它检查当前的编译器并相应地添加标志。
我认为使用单个 .cmake 是个好习惯将所有项目配置集中在一个地方的文件。在工作中我们所有的CMakeLists.txt从 include( ../cmake/configs.cmake ) 开始.该文件设置各种选项,例如标准包含目录、默认编译器标志等。
为了解决包含目录的问题,我建议您在源文件中使用绝对路径而不是相对路径。定义一个标准的包含目录,例如 engine/main/include总是#include相对于该路径的文件。在您的示例中,如果您想包含 engine/main/include/somefolder/header.h , 你会写 #include <somefolder/header.h> (使用 <> 而不是引号告诉 C++ 预处理器在查找文件时跳过当前目录)。
2) how can I address the error of not finding the header file (make gives: (...)\engine\main\src\main.cc:2:17: fatal error: App.h: No such file or directory) ?
您的 cmake 布局存在许多问题,但您收到该错误的原因是您需要调用 include_directories在 CMakeLists.txt (1)
除此之外,你的另一个CMakeLists.txt文件也有问题。在 CMakeLists.txt (2) , add_library 的参数错了;应该是../src/App.cc ,否则你只是添加一个空库。你不需要那个 set_target_properties要么,至少如果你得到 add_library 就不会论据对。您还需要一个 include_directory调用相同的 CMakeLists.txt那就是添加库;把它放在 (3)并没有真正做任何事情。
实际上,您不需要 CMakeLists.txt文件在 include目录,因为那里没有什么可构建的。最好把add_library来电CMakeLists.txt (3) , 在调用 include_directories 之后.
我希望这能消除您的一些疑虑。
关于c++ - 设置基本的多平台启用 cmake 的项目时需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084917/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain