我有一个项目(一个库),它被细分为几个包含代码的目录.我想在项目的根目录中使用g ++搜索头文件,因此我可以避免跨多个源文件的相同头文件的不同包含路径.
主要是,该root/目录有子目录A/,B/并且C/,所有这些都.hpp和.cpp里面的文件.如果A中的某个源文件想包含file.hpp在B中,那么就必须这样做:#include "../B/file.hpp".对于C中的另一个源文件也是如此.但是,如果A本身具有需要文件的子目录file.hpp,那么它将是不一致的并且如果我决定移动文件会导致错误(因为包含路径将是"../../B/file.hpp").
此外,这还需要在其他项目中工作,这些项目位于其他项目之外root/.我已经知道有一个选项可以手动将我的所有头文件复制到默认搜索目录中,但我想按照我描述的方式执行此操作.
编辑:使用该库的所有程序必须仅使用g++ prog.cpp lib.a -o prog.这意味着永久设置g ++的包含路径!
C++标准库头可以以未指定的方式彼此包含,因此程序员通常不应该依赖于包括另一个的一个头.但是,在少数情况下,保证标头包含另一个标头,或者使某些功能可用,否则需要包含另一个标头.这些案件是什么?
我想在一个地方存储我的库的版本号.所以我在CMake文件中定义了这样一个变量:
SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface")
Run Code Online (Sandbox Code Playgroud)
根据这个定义,我可以根据Microsoft的定义生成一个version.rc文件,我将其编译到库中,然后在我的dll文件的属性窗口中正确显示.
现在我也想在我的c ++源代码中使用这个CMake变量,但实际上我没有找到一个有效的解决方案.我尝试过不同的东西:
#ifndef VERSION_LIBINTERFACE
# define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@
#endif
Run Code Online (Sandbox Code Playgroud)
或这个:
unsigned int getLibInterfaceVersion()
{
return @LIBINTERFACE_VERSION@;
}
Run Code Online (Sandbox Code Playgroud)
但是编译器不会接受任何东西.由于我对CMake-Documentation的研究没有得到任何结果,我希望有人可以给我基本的建议.
提前致谢.
我有一个C++程序(.cpp),我希望在其中使用C头文件中存在的一些函数,如stdio.h,conio.h,stdlib.h,graphics.h,devices.h等.
我可以在我的cpp文件中包含stdio.h库,如下所示:#include <cstdio>.如何包含其他库文件?
如何添加graphics.h库?
我正在使用Microsoft Visual Studio 6.0企业版和Turbo C++ 3.0.
在我们的工作流程,我们可以有一个模块,一个是由几个头文件,模块A不产生任何二进制(旁注:这显然会被其他模块,包括部分标题从使用模块A生成的二进制文件) .
一个很好的例子是一个只有标题的库,由于INTERFACE库的概念,CMake 3引入了很好的支持(参见这个SO答案,以及CMake的特性文档).
我们可以从模块A中创建一个接口库目标:
add_library(module_A INTERFACE)
Run Code Online (Sandbox Code Playgroud)
这为我们提供了CMakes目标的所有优点(可以将其用作另一个目标的依赖,导出它,传递转发需求等)
但在这种情况下,模块A中的标头不会显示在我们的IDE中(Xcode,但我们希望它与大多数/所有其他IDE相同).
这被证明是工作流程中的主要缺点,因为我们需要在IDE中显示组成模块A的文件以进行编辑.是否有可能实现这一目标?
为什么我们需要在C++程序中使用namespace和include指令?
例如,
#include <iostream>
using namespace std;
int main() {
cout << "Hello world";
}
Run Code Online (Sandbox Code Playgroud)
为什么只有#include或者只是使用"使用命名空间std"并摆脱另一个?
(我想到了与Java的类比,import java.net.*将从java.net导入导入所有东西,你不需要做任何其他事情.)
我在写作课时遇到问题.我已将类拆分为定义类的.h文件和实现该类的.cpp文件.
我在Visual Studio 2010 Express中收到此错误:
错误C2039:'string':不是'std'的成员
这是标题FMAT.h
class string;
class FMAT {
public:
FMAT();
~FMAT();
int session();
private:
int manualSession();
int autoSession();
int mode;
std::string instructionFile;
};
Run Code Online (Sandbox Code Playgroud)
这是实现文件FMAT.cpp
#include <iostream>
#include <string>
#include "FMAT.h"
FMAT::FMAT(){
std::cout << "manually (1) or instruction file (2)\n\n";
std::cin >> mode;
if(mode == 2){
std::cout << "Enter full path name of instruction file\n\n";
std::cin >> instructionFile;
}
}
int FMAT::session(){
if(mode==1){
manualSession();
}else if(mode == 2){
autoSession();
}
return 1;
}
int FMAT::manualSession(){
//more code …Run Code Online (Sandbox Code Playgroud) 我正在学习C语言,我看到了一个我以前从未见过的新扩展.
带有扩展名的文件library.h.in是什么意思?
它是带有扩展名".h"的简单标题吗?有什么不同?
鉴于此代码示例:
complex.h:
#ifndef COMPLEX_H
#define COMPLEX_H
#include <iostream>
class Complex
{
public:
Complex(float Real, float Imaginary);
float real() const { return m_Real; };
private:
friend std::ostream& operator<<(std::ostream& o, const Complex& Cplx);
float m_Real;
float m_Imaginary;
};
std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
#endif // COMPLEX_H
Run Code Online (Sandbox Code Playgroud)
complex.cpp:
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
m_Real = Real;
m_Imaginary = Imaginary;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:
#include "complex.h"
#include <iostream>
int main()
{
Complex …Run Code Online (Sandbox Code Playgroud) 当我们用Java,Vala或C#设计类时,我们将定义和声明放在同一个源文件中.但在C++中,传统上优先将两个或多个文件中的定义和声明分开.
如果我只使用头文件并将所有内容放入其中,如Java,会发生什么?是否存在性能损失?
header-files ×10
c++ ×8
c ×2
cmake ×2
c++11 ×1
c++14 ×1
c++17 ×1
class ×1
declaration ×1
definition ×1
directory ×1
g++ ×1
header ×1
ide ×1
include-path ×1
makefile ×1
namespaces ×1
xcode ×1