标签: compilation

模板:使用前向声明来减少编译时间?

我必须处理一个由许多模板化类组成的库,这些类当然都是在头文件中实现的.现在我正试图找到一种方法来减少无法忍受的长编译时间,因为我几乎必须在每个编译单元中包含整个库.

尽管有模板,使用前向声明是否可能?我正在尝试下面的例子中的一些东西,我尝试绕过它#include <vector>,作为一个例子,但它给了我一个链接器错误,因为push_back未定义.

#include <iostream>

namespace std {
  template<class T>
  class vector {
  public:
    void push_back(const T& t);
  };
}

int main(int argc, char** argv) {
  std::vector<int>* vec = new std::vector<int>();
  vec->push_back(3);
  delete vec;
  return EXIT_SUCCESS;
}

$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我尝试了一次预编译的头文件但是根本没有改变编译时间(我确实确实加载了它们而不是真正的头文件).但是,如果你们都说预编译头应该是可行的方式,那么我将再试一次.

更新:有些人说,转发声明STL类是不值得的.我应该强调,vector上面的STL 只是一个例子.我并没有真正尝试向前声明STL类,但它是关于我必须使用的某些库的其他严格模板化的类.

更新2:有没有办法使上面的例子实际编译和链接正确?Logan建议使用-fno-implicit-templates并放在template class std::vector<int>某个地方,大概是一个.cpp可以编译的单独文件-fno-implicit-templates,但我仍然会遇到链接器错误.再次,我试图理解它是如何工作的,std::vector以便我可以将它应用于我实际使用的模板化类.

c++ linker templates compilation forward-declaration

26
推荐指数
3
解决办法
2万
查看次数

在emacs中使用两个帧时,如何防止编译缓冲区同时出现?

我使用两个显示器,并经常使用两个框架打开的emacs; 每个监视器一个.每个框架被分成两个并排的窗口,如下所示:

 a | b   <-- frame 1 in monitor 1
-------
 c | d   <-- frame 2 in monitor 2
Run Code Online (Sandbox Code Playgroud)

当我在窗口a中点击"编译"按钮时,编译缓冲区在其旁边的缓冲区中打开.到现在为止还挺好:

 a | compilation
-----------------
 c |     d
Run Code Online (Sandbox Code Playgroud)

但是,如果我然后移动到窗口c来编辑一些东西,然后再次点击编译,窗口d也会访问编译缓冲区:

 a | compilation
------------------
 c | compilation
Run Code Online (Sandbox Code Playgroud)

所以现在我有一半的屏幕空间占用了同一个编译缓冲区的两个副本,想知道为什么我有两个显示器:)

当我的光标位于当前打开的编译缓冲区旁边的缓冲区中时,我可以通过认真地仅仅点击编译键来防止这种情况,但是我很早就打了'编译',而且我经常没有心思这样做.我觉得必须有一些我可以调整的东西.emacs所以我不应该这样做.

有什么建议?理想情况下,当我点击'compile'时,当前打开的编译缓冲区应该从之前的窗口移动到当前使用的窗口旁边的窗口.如果这太复杂了,我很容易解决让emacs 没有访问相邻窗口中的编译缓冲区,如果它已经在另一个窗口中打开了.

emacs compilation window dot-emacs frame

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

如何在编译python模块扩展时静态链接库

我想修改一个setup.py文件,使命令"python setup.py build"编译一个静态(而不是动态)链接到库的基于C的扩展模块.

该扩展目前动态链接到许多库.除了静态链接到一个库之外,我想保持一切不变.我通过手动修改对distutils运行的gcc的调用成功完成了这项工作,尽管它需要我明确列出了依赖库.

也许这是太多的信息,但为了清楚起见,这是在"python setup.py build"脚本中执行的最终链接命令:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib -ligraph -o build/lib.linux-x86_64-2.7/igraph/core.so
Run Code Online (Sandbox Code Playgroud)

这是我的手动修改:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib /system/lib/libigraph.a -lxml2 -lz -lgmp -lstdc++ -lm -ldl -o build/lib.linux-x86_64-2.7/igraph/core.so
Run Code Online (Sandbox Code Playgroud)

分发Python模块的 2.3.4节讨论了库的规范,但只有"library_dirs"是合适的,并且这些库是动态链接的.

我正在使用Linux环境进行开发,但该软件包也将在Windows上进行编译和安装,因此便携式解决方案就是我所追求的.

有人可以告诉我在哪里查找说明,或者如何修改setup.py脚本?(提前致谢!)

我是StackOverflow的新手,所以如果我没有正确标记这个问题,或者如果我在这个帖子中犯了一些其他错误,我很抱歉.

python static compilation

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

是否有Java的交互式解释器?

我想从shell以交互方式执行java命令:有没有办法这样做?

java interpreter compilation

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

警告:Nokogiri是针对LibXML版本2.7.7构建的,但动态加载了2.6.16

当我启动Rails时,我无法理解为什么我从Nokogiri那里得到这个错误.从我知道的一点点来看,似乎有些东西导致加载旧版本的libxml2,Nokogiri最终会使用它,而不是它编译的版本.

如果没有警告(并使用正确的libxml2),我需要做什么才能使其正常工作?

我在OS X 10.5.8的Macbook上运行它:

$ rake db:create
(in /Users/gareth/Sites/Rails3/ngtest)
WARNING: Nokogiri was built against LibXML version 2.7.7, but has dynamically loaded 2.6.16
HI.  You're using libxml2 version 2.6.16 which is over 4 years old and has
plenty of bugs.  We suggest that for maximum HTML/XML parsing pleasure, you
upgrade your version of libxml2 and re-install nokogiri.  If you like using
libxml2 version 2.6.16, but don't like this warning, please define the constant
I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 before requring nokogiri.

ngtest_test already exists …
Run Code Online (Sandbox Code Playgroud)

compilation ruby-on-rails rvm

26
推荐指数
4
解决办法
1万
查看次数

学习渐进式编译设计

有很多关于创建编译器的书籍和文章,它们一次完成所有编译工作.那些IDE使用的增量编译器/解析器的设计呢?我熟悉第一类编译器,但我从未使用过第二类编译器.

我试图阅读一些关于Eclipse Java开发工具的文章,但是他们描述了如何使用完整的基础结构(即API)而不是描述内部设计(即它如何在内部工作).

我的目标是为我自己的编程语言实现增量编译器.你会推荐哪些书籍或文章?

parsing compilation incremental-compiler

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

Java"new String [-1]"传递编译.怎么会?

在Java中摆弄时,我初始化了一个负长度的新String数组.即 -

String[] arr = new String[-1];
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,编译器没有抱怨它.谷歌搜索没有提出任何相关的答案.任何人都能对此事有所了解吗?

非常感谢!

java arrays compilation

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

MinGW c ++编译器zlib1.dll缺少错误?

我刚刚开始学习C++ for school,我正在尝试下载编译器MinGW来编译我的源代码.但是,每次我尝试编译程序时,都会显示一条错误消息,说明zlib1.dll缺少该程序.

这是错误消息

程序无法启动,因为您的计算机缺少zlib1.dll

我试过安装/重新安装没有运气.我不知道这里有什么问题?

任何人都可以帮我解决这个问题,因为我有一些我需要做的功课,但我不能没有编译器.

谢谢.

c++ mingw compilation

26
推荐指数
3
解决办法
6万
查看次数

是否可以在makefile中定义C宏?

是否可以将#define VAR(在C程序中)的等价物放入makefile中,以便可以控制程序的哪一部分应该编译?

c makefile compilation

25
推荐指数
3
解决办法
4万
查看次数

错误:无法解析以下类的超类型.请确保您在类路径中具有所需的依赖项

我无法编译我的Android Kotlin项目.

我不知道这是什么......

Gradle日志:

错误:无法解析以下类的超类型.请确保您在类路径中具有所需的依赖项:class android.support.v7.app.AppCompatActivity,unresolved supertypes:SupportParentable

build.gradle(app)

buildscript {
    ext.android_plugin_version = "2.3.3"
    ext.kotlin_version = '1.1.2-5'

    repositories {
        maven { url 'https://maven.google.com' }
        maven { url "https://jitpack.io" }

        mavenCentral()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:$android_plugin_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.google.com' }
        maven { url "https://jitpack.io" }

        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

def compat_version = '26.+'
def play_services_version …
Run Code Online (Sandbox Code Playgroud)

android compilation kotlin

25
推荐指数
3
解决办法
3万
查看次数