在Windows中使用g ++构建C ++文件不能用作.bat

时间:2015-03-20 12:58:54

标签: c++ windows powershell batch-file

早上好,

我是Windows的新用户(使用Linux + 10年),出于某种原因我必须编译C ++程序。我在Windows中没有很好的调试经验,但我很想知道我做错了什么。

我使用MinGW和g ++以及不同的库,特别是一个名为libjpeg的文件。

当我编译&使用以下命令在PowerShell中构建文件,一切正常,我的C ++代码为我提供了预期的结果。

g++ -o imageProcessing imageProcessing.cpp -lgdi32 -Dgmic_use_jpeg -I'C:\GnuWin32\include' -L'C:\GnuWin32\lib' -ljpeg

当我在.bat文件中使用完全相同的命令时,或直接在我的C ++编辑器(geany)中使用时,我有这样的错误:

imageProcessing.cpp:6:21: fatal error: jpeglib.h: No such file or directory
 #include <jpeglib.h>
                     ^
compilation terminated.

它找不到jpeglib.h。

在环境变量中设置了正确的路径。

我使用的libjpeg允许我在使用CImg库时打开/保存jpeg图片。它可以在这里找到:

Jpeg for Windows

这是一个非常简单的例子:

#include <iostream>
#include <jpeglib.h>

using namespace std;

int main() {
    float number;
    cout << "Enter a number: "; 
    cin  >> number;
}

让我们调用此test.cpp,其位置为:C:\Users\Rémi\Documents\Image_Procesing\C++\testCImg

以下是我在环境变量路径中添加的内容:C:\GnuWin32\lib;C:\GnuWin32\bin;C:\MinGW\bin;

这是我的test.bat:g++ -o test test.cpp -lgdi32 -Dgmic_use_jpeg -I'C:\GnuWin32\include' -L'C:\GnuWin32\lib' -ljpeg

test.bat也位于:C:\Users\Rémi\Documents\Image_Procesing\C++\testCImg

.bat失败如下:

C:\Users\Rémi\Documents\Image_Procesing\C++\testCImg>g++ -o test test.cpp -lgdi32 -Dgmic_use_jpeg -I'C:\GnuWin32\include
' -L'C:\GnuWin32\lib' -ljpeg
test.cpp:3:21: fatal error: jpeglib.h: No such file or directory
 #include <jpeglib.h>
                     ^
compilation terminated.

我昨天花了一整天的时间试图解决这个问题,而且我受到Windows知识的限制。 如果有人可以帮助我,我会非常感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果包含路径问题,请让GCC告诉您它的用途。

在下面的示例中,您可以清楚地看到它正在搜索位置'test'并忽略它不存在。

然后,您可以推断出,如其他地方所述,Batch中的单引号是错误的。那时你会给"test"一个去取得成功。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\lightness>g++ -E -x c++ - -v -I'test'
Using built-in specs.
COLLECT_GCC=g++
Target: mingw32
Configured with: ../../src/gcc-4.7.1/configure --build=mingw32 --enable-language
s=c,c++,ada,fortran,objc,obj-c++ --enable-threads=win32 --enable-libgomp --enabl
e-lto --enable-fully-dynamic-string --enable-libstdcxx-debug --enable-version-sp
ecific-runtime-libs --with-gnu-ld --disable-nls --disable-win32-registry --disab
le-symvers --disable-build-poststage1-with-cxx --disable-werror --prefix=/mingw3
2tdm --with-local-prefix=/mingw32tdm --enable-cxx-flags='-fno-function-sections
-fno-data-sections' --with-pkgversion=tdm-1 --enable-sjlj-exceptions --with-bugu
rl=http://tdm-gcc.tdragon.net/bugs
Thread model: win32
gcc version 4.7.1 (tdm-1)
COLLECT_GCC_OPTIONS='-E' '-v' '-I' ''\''test'\''' '-mtune=i386' '-march=i386'
 c:/mingw32/bin/../libexec/gcc/mingw32/4.7.1/cc1plus.exe -E -quiet -v -I 'test'
-iprefix c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/ - -mtune=i386 -march=i386
ignoring nonexistent directory "c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/../../..
/../mingw32/include"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/inc
lude/c++"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/inc
lude/c++/mingw32"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/inc
lude/c++/backward"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/inc
lude"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/../
../../../include"
ignoring duplicate directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/inc
lude-fixed"
ignoring nonexistent directory "c:/mingw32/lib/gcc/../../lib/gcc/mingw32/4.7.1/.
./../../../mingw32/include"
ignoring nonexistent directory "'test'"
#include "..." search starts here:
#include <...> search starts here:
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/include/c++
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/include/c++/mingw32
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/include/c++/backward
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/include
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/../../../../include
 c:\mingw32\bin\../lib/gcc/mingw32/4.7.1/include-fixed
End of search list.
# 1 "<stdin>"

答案 1 :(得分:1)

Windows中的参数标记传统上使用"字符。我认为单引号被解释为路径名的一部分,导致“没有这样的文件或目录”错误。这可以解释为什么它在PowerShell中工作,因为单引号在那里是有效的。

看看你是否有更好的运气:

g++ -o imageProcessing imageProcessing.cpp -lgdi32 -Dgmic_use_jpeg -I"C:\GnuWin32\include" -L"C:\GnuWin32\lib" -ljpeg
相关问题