【发布时间】:2016-01-15 04:23:10
【问题描述】:
我正在尝试在我的 c++ 程序中包含以下标头:
https://raw.githubusercontent.com/syoyo/tinyobjloader/master/tiny_obj_loader.h
但是当我尝试使用 Cygwin g++ 编译并运行它时,我的简单程序运行并退出而不打印任何内容:
#include <iostream>
#define TINYOBJLOADER_IMPLEMENTATION
#include "tiny_obj_loader.h"
int main( int argc, const char* argv[] )
{
std::cout << "hello world" << std::endl;
}
我没有收到编译或运行时错误。当我注释掉“tiny_obj_loader.h”包含时,它会打印“hello world”。另外,当我注释掉大部分 tiny_obj_loader.h 文件时,我可以将其缩小到导致问题的以下函数:
static void InitMaterial(material_t &material) {
material.name = "";
material.ambient_texname = "";
material.diffuse_texname = "";
material.specular_texname = "";
material.specular_highlight_texname = "";
material.bump_texname = "";
material.displacement_texname = "";
material.alpha_texname = "";
for (int i = 0; i < 3; i++) {
material.ambient[i] = 0.f;
material.diffuse[i] = 0.f;
material.specular[i] = 0.f;
material.transmittance[i] = 0.f;
material.emission[i] = 0.f;
}
material.illum = 0;
material.dissolve = 1.f;
material.shininess = 1.f;
material.ior = 1.f;
material.unknown_parameter.clear();
}
对该函数的以下修改导致“hello world”正确打印:
static void InitMaterial(material_t &material) {
//nothing
}
static int InitMaterial(material_t &material) {
return 0;
}
但是,这会导致它不起作用:
static void InitMaterial(material_t &material) {
material.name = "";
}
请注意,material_t 是匿名 typedef,我想知道这可能会导致问题...?这到底是怎么回事?这如何导致 std::cout 不起作用?它似乎可以在 linux 上与 g++ 一起使用。
更新:
您可以在上面的链接中看到material_t 的定义,但这里是为了方便:
namespace tinyobj {
typedef struct {
std::string name;
float ambient[3];
float diffuse[3];
float specular[3];
float transmittance[3];
float emission[3];
float shininess;
float ior; // index of refraction
float dissolve; // 1 == opaque; 0 == fully transparent
// illumination model (see http://www.fileformat.info/format/material/)
int illum;
int dummy; // Supress padding warning.
std::string ambient_texname; // map_Ka
std::string diffuse_texname; // map_Kd
std::string specular_texname; // map_Ks
std::string specular_highlight_texname; // map_Ns
std::string bump_texname; // map_bump, bump
std::string displacement_texname; // disp
std::string alpha_texname; // map_d
std::map<std::string, std::string> unknown_parameter;
} material_t;
...//tons of other stuff
【问题讨论】:
-
material_t的定义是什么
-
@George Houpis 更新
-
您使用的是什么版本的 g++?运行 g++ 4.9.3 x64 对我有用。
-
g++ 5.2.0 x86 位
-
这很奇怪。我能够重现该问题。但是,我认为这是因为可执行文件链接到意外的 dll。尝试构建静态或调整 dll 路径。