即使是简单的小型Haskell程序也会变成巨大的可执行文件.
我已经编写了一个小程序,它被编译(用GHC)到二进制文件,大小扩展到7 MB!
甚至可以将一个小的Haskell程序编译成巨大的二进制文件?
如果有的话,我可以做些什么来减少这个?
昨晚我工作到很晚,试图从源代码构建Linux的GLFW 3软件包.这个过程花了我很长时间,总共大约3个小时,部分是因为我不熟悉CMake,部分是因为我不熟悉GLFW.
我希望这篇文章能够帮助你摆脱昨天的困难!我想我应该写一篇简短的文章,希望能为你节省几个小时的生命......
感谢#glfw IRC频道上的"urraka","b6"和"niklas",我已经能够使用glfw 3.0.1版了.
事实证明,这不是一个简单的过程(当然不适合我,我不是专家),因为网上没有太多关于glfw3的文档,尤其是关于使用CMake进行设置的文档.
我被要求将其分成问题和答案部分,所以我已经这样做了,答案部分现在在下面.
如果GLFW3的任何维护者看到这个,那么我给他们的信息是请在你的网站上添加"在Windows,Mac OS X和Linux上设置GLFW3"部分!使用GLFW编写程序非常容易,因为在线文档非常好,可以快速扫描所有可用的类和模块,然后您就可以开始了.这里展示的测试项目的例子也非常好.我发现的两个主要问题是,首先如何在我的系统上设置GLFW3,其次是如何构建GLFW3项目?对于非专家来说,这两件事可能还不够清楚.
今天简单介绍一下(日期:2014-01-14),看起来GLFW网站自从我上次查看以来已经发生了很大的变化,现在有一个关于用GLFW编译GLFW和建筑程序的部分,我认为这是新的.
我最近开始学习OpenGL(> 3.3)并且我注意到很多示例和教程都使用了freeglut和glew,但是并没有真正解释它们的区别.我在谷歌搜索和阅读广告后发现的最好的描述是这个OpenGL相关的工具包和API,但发现它缺乏.我甚至在SO上读过标签信息.
作为OpenGL的新手,我仍然试图掌握不同的概念.我已经到了创建基本程序的阶段,该程序使用glew,创建上下文(在Windows上,VS2010),并绘制真正基本的形状,所有这些都不需要明确包含freeglut.所以我不明白为什么我需要它.
所以我的问题是,有什么区别:
-freeglut
-glew
- (&glfw)
另一个人不能
做什么呢?
我的大学开始教授包含OpenGL编程的课程.他们让我们使用FreeGLUT为OpenGL创建窗口和上下文,但我在lynda.com上找到了一个关于OpenGL的在线课程,他们使用GLFW而不是FreeGLUT.
所以我想知道我应该使用哪一个,两者之间有什么区别?
我正在编写一个glfw应用程序,我将函数调用函数包装到一个简单的类中.我在设置密钥回调时遇到问题.我的课程定义为:
class GAME
{
private:
bool running;
public:
GAME();
int execute();
void events(int, int);
int loop();
int render();
};
Run Code Online (Sandbox Code Playgroud)
执行功能是:
int GAME::execute()
{
glfwOpenWindow(640, 320, 8, 8, 8, 8, 0, 0, GLFW_WINDOW);
glfwSetWindowTitle("Viraj");
glfwSetKeyCallback(events);
running = true;
while(glfwGetWindowParam(GLFW_OPENED))
{
glfwPollEvents();
loop();
render();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2010上编译以下代码,给出错误:
error C3867: 'GAME::events': function call missing argument list; use '&GAME::events' to create a pointer to member
使用&GAME :: events提供:
error C2664: 'glfwSetKeyCallback' : cannot convert parameter 1 from 'void (__thiscall GAME::* …
(非常详细的问题报告 - tl;底部是博士!)
我真的更喜欢GLFW到Glut,并希望它的Golang绑定在Windows 64位下使用Go 1.0.1 64位.在Linux下,它的绑定完美无瑕.这在原则上是在Windows下是可行的- GitHub的用户家校会设法来做到这一点,但他是在Win32和他的提示没有解决我的问题呢.但是我确实有一个基于tdm64-gcc-4.6.1的完整而干净的Mingw64设置.
Now here's the strange thing -- getting the freeglut binding to work under 64-bit Windows, 64-bit Go 1.0.1 works -- the glfw binding fails for me. I want to figure out why, as they essentially both use the same cgo features and techniques.
Note I currently have a self-made half-baked but essentially working replacement package in place that uses LoadLibrary/GetProcAddress calls to expose glfw.dll in …
为什么某些静态库(lib*.a)可以以与共享库(lib*.so)链接(ld -l switch)相同的方式链接,但有些不可以?
我一直被教导所有库,无论是否静态,都可以与-l ...链接,但是我到目前为止遇到了一个库(GLFW),如果我发出"未定义的引用"链接错误,它什么都不做试图以这种方式链接它.
根据对这个问题的回答,链接静态库的"正确"方法是将它们与我自己的目标文件一起直接包含在内,而不是使用-l.而且,就GLFW库而言,这肯定解决了这个问题.但是我正在使用的每个其他静态库在与-l链接时工作得很好.
所以:
随着我对跨平台框架/库的搜索工作的进行,GLFW被多次提及.所以,我决定尝试一下.现在,似乎我甚至无法启动一个窗口.: - /
#include
#include
#include
int main(int argc, char *argv[])
{
int running = GL_TRUE;
srand(time(NULL));
if (!glfwInit())
exit(EXIT_FAILURE);
if (!glfwOpenWindow(300, 300, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
{
glfwTerminate();
exit(EXIT_FAILURE);
}
while (running)
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(rand() % 255 + 1, rand() % 255 + 1, rand() % 255 + 1, 0);
glfwSwapBuffers();
running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED);
}
glfwTerminate();
exit(EXIT_SUCCESS);
}
我在MVC++ 2010中输入了这个,链接了头文件和2个lib文件(它有1个DLL文件,所以我把它扔进了SysWOW64文件夹),我得到了这些错误:
1>------ Build started: Project: glfwTest, Configuration: Debug Win32 ------
1> test.cpp
1>c:\users\andrew\documents\visual studio 2010\projects\glfwtest\glfwtest\test.cpp(8): …Run Code Online (Sandbox Code Playgroud) 我在Mac OS X 10.8上使用GLFW 3.0,显卡是Intel HD Graphics 5000
我的OpenGL API版本是2.1,获得者
glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
Run Code Online (Sandbox Code Playgroud)
编译选项:
g++ ... -framework OpenGL -framework Cocoa -framework IOKit ...
Run Code Online (Sandbox Code Playgroud)
头:
#include <GLFW/glfw3.h>
#include <GL/glu.h>
Run Code Online (Sandbox Code Playgroud)
版本总是2.1,与报告的3.2不同.
https://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1085_Core.html
...
现在我的操作系统已经升级到10.9,OpenGL版本仍然是2.1.
它仍然无法编译GLSL 3.3,而Apple表示它支持4.1.
https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html
我怎样才能使它工作?
我是Linux的新手(使用Ubuntu 14.04 LTS 64bit),来自Windows,我正试图移植我现有的CUDA项目.
通过链接时
/usr/local/cuda/bin/nvcc -arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_clipboard.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [CUDANN] Error 1
Run Code Online (Sandbox Code Playgroud)
答案似乎与本文中的解决方案密切相关(奇怪的链接错误:DSO从命令行中丢失),但鉴于我对Linux的经验不足,我无法使它们适应我自己的问题.
关于问题可能是什么的任何想法?
以下是编译期间的完整输出:https://gist.github.com/wbolden/857eddd11e4dcb915c02
这是我对Makefile的尝试:https: //gist.github.com/wbolden/135033daae04ed0d8cf3