我正在尝试使用make编译c ++文件。但是,默认情况下它不使用-std = c ++ 11标志。每当我需要编译一个使用c ++ 11特定功能的程序时,我必须使用g ++显式编译它。
所以,我想问一下如何让我的系统上的所有c ++文件自动使用-std = c ++ 11选项。
如果我需要为g ++更改一些全局makefile,那么Linux Mint 18上makefile的位置是什么以及需要更改或添加的内容是什么?
或者我是否需要为自己创建一个Makefile?
编辑1:我正在调用make
// Author model
class Author: NSObject, NSCoding
{
var name: String
var books:[Book] = [Book]()
init(name:String, books:[Book]?) {
self.name = name
guard let bookList = books else {
return
}
self.books = bookList
}
required convenience init?(coder aDecoder: NSCoder) {
let name = aDecoder.decodeObject(forKey:"name") as! String
let books = aDecoder.decodeObject(forKey:"books") as! [Book]
self.init(name:name, books:books)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey:"name")
aCoder.encode(books, forKey:"books")
}
}
// Book model
class Book: NSObject, NSCoding {
var title: String
var author: Author?
init(title:String, author: Author?) {
self.title = title
self.author = author
}
public convenience required init?(coder aDecoder: NSCoder) {
let title = aDecoder.decodeObject(forKey: "title") as! String
let author = aDecoder.decodeObject(forKey: "author") as! Author
self.init(title:title, author:author)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(title, forKey: "title")
aCoder.encode(author, forKey: "author")
}
}
// Create the data
var author:Author = Author(name: "Tom Clancy", books: nil)
let book0 = Book(title: "The Hunt for Red October", author: author)
let book1 = Book(title: "Red Storm Rising", author: author)
author.books.append(contentsOf: [book0, book1])
// -----------
// Save data
let manager = FileManager.default
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first! as URL
let writePath: URL = url.appendingPathComponent("archive.plist")
print("Attempting to save to: \(writePath)")
let saveData = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: saveData)
archiver.encode(books, forKey:"books")
archiver.encode(author, forKey: "author")
//NSKeyedArchiver.archiveRootObject(books, toFile: writePath.path)
archiver.finishEncoding()
_ = saveData.write(to: writePath, atomically: true)
// -----------
// Load data
print("Attempting to load from: \(writePath)")
if FileManager.default.fileExists(atPath: writePath.path) {
if let saveData = try? Data(contentsOf: writePath) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: saveData)
// Crash occurs here
var authorData = unarchiver.decodeObject(forKey: "author") as! Author
print (authorData.name)
}
} else {
print("No data archive exists")
}
目录中只有.cpp文件及其二进制文件。我目录中没有任何Makefile。
编辑2:这里,make myfile
是我要编译的c ++文件的名称。
当我使用-d选项运行make时,我得到以下输出(我无法粘贴所有输出,因为它很长并且超出了体积限制所以,我包括输出的屏幕截图) 。
Image 1
并且这个图像(2)从末尾开始有一些线条
Image 2
我故意对文件myfile
进行了更改,以便make找到要做的事情!
答案 0 :(得分:3)
没有“全局makefile”,并且无法更改make的所有调用的默认标志(除非您将源代码编辑为GNU make并自行编译,这在这种情况下是个坏主意)。
在你的makefile中,添加以下行:
CXXFLAGS += -std=c++11
假设您正在使用内置规则来编译内容,或者您正在使用标准变量和您自己的规则,那么这将完成您所需的操作。
如果这不起作用,我们需要查看你的makefile或至少你用来构建C ++源文件的规则(像-d
输出这样的东西在这里没用 - 这将是有趣的是,如果没有构建文件,你认为应该是或类似的。)
答案 1 :(得分:1)
为所有C ++项目设置系统范围的语言并不是一个好主意。相反,定义一个Makefile
,指定您喜欢的任何编译器选项:
CXXFLAGS := -std=c++11 $(CXXFLAGS)
然后在编译C ++程序时将CXXFLAGS传递给编译器(假设您使用的是默认的GNU Make规则)。
如果Makefile位于当前工作目录中,您现在可以运行make target
以将target.cpp
文件编译为target
可执行文件。
如果Makefile位于另一个目录中,则必须指定它的路径:
make -f path/to/your/Makefile target
如果只想为一次运行添加额外参数,可以在命令行上设置环境变量或make变量:
# environment:
CXXFLAGS='-std=c++11' make target
# make variable:
make target CXXFLAGS='-std=c++11'
其中任何一个都会导致执行g++ -std=c++11 target.cpp -o target
或等效。
理论上,您可以将您的shell配置文件编辑为export CXXFLAGS='-std=c++11'
,这将使您运行的所有程序都可以使用该环境变量。实际上,通过环境变量设置编译器选项往往会导致比它解决的问题更多的问题。
在所有这些解决方案中,编写普通的Makefile是迄今为止最简单的方法。这样,所有构建配置都在一个地方并完全自动化。