Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
438 views
in Technique[技术] by (71.8m points)

linker - Why does my Visual C++ .exe project build create .lib and .exp files?

I have a solution consisting of 3 projects. One is a static library, and two are console-based .exe files that depend on and link against this library. Their settings seem to be identical. I build one of them:

1>------ Build started: Project: masksample, Configuration: Debug Win32 ------
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>masksample.cpp
1>Compiling manifest to resources...
1>Linking...
1>LINK : C:UsersDarekSzPracacciDebugmasksample.exe not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>masksample - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

Then I go on to building the other:

1>------ Build started: Project: calibsample, Configuration: Debug Win32 ------
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>calibsample.cpp
1>Compiling manifest to resources...
1>Linking...
1>LINK : C:UsersDarekSzPracacciDebugcalibsample.exe not found or not built by the last incremental link; performing full link
1> Creating library C:UsersDarekSzPracacciDebugcalibsample.lib and object C:UsersDarekSzPracacciDebugcalibsample.exp
1>Embedding manifest...
1>calibsample - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

Why does the linker create the .lib and .exp files this time? Is there some option to turn this on and off that I activated without knowing about it?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It's a bit late but, maybe someone else could find useful this hint.

BTW I'm not a c++ guru...

In my solution i have 3 projects. One is a dll project, the others are two Win32 app projects referencing the dll project.

Usually, with your dll built, you have also some others file generated (.exp, .lib) also for the NON dll projects. This can occour when you include a .h file of the dll project, into the app project, which contains a class marked with __declspec(dllexport).

To avoid the linker think your are trying to include some .h files to "export" use a conditional expression to define your _declspec macro.

Example:

#if defined(_DO_NOT_EXPORT)
#define DllExport  
#else
#define DllExport __declspec(dllexport)
#endif

Ok, let's say you have a MyClass.h in your dll project.

in your .h file you could have now:

class DllExport MyClass {
 ...
}

When you want to include this .h file into a NON dll project, you have simply to define the _DO_NOT_EXPORT condition

#define _DO_NOT_EXPORT
#include "MyClass.h"

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...