编译dll为什么没有lib文件产生

ly0914 2010-04-22 02:30:30
我用VC2005编译dll文件,建立的是一个Win32控制台应用程序dll空项目,代码如下:
.h文件
#ifdef TRAVEL_DLL
#else
#define TRAVEL_DLL _declspec(dllimport)
#endif

#include <osgViewer/Viewer>
#include <osgGA/MatrixManipulator>
#include <osgGA/TrackballManipulator>
#include <osgUtil/IntersectVisitor>
#include <osg/LineSegment>
#include <osg/Point>
#include <osg/Geometry>
#include <vector>

class TravelManipulator :
public osgGA::MatrixManipulator
{
public:
TravelManipulator(void);
public:
~TravelManipulator(void);
static TravelManipulator * TravelScene(osg::ref_ptr <osgViewer::Viewer> viewer);
private:
//viewer
osg::ref_ptr <osgViewer::Viewer> m_pHostViewer;

unsigned int m_nID;
float m_fMoveSpeed;
osg::Vec3 m_vPosition;
osg::Vec3 m_vRotation;
public:
bool m_bLeftButtonDown;
float m_fpushX;
void Active(void);
virtual void setByMatrix(const osg::Matrixd& matrix);
virtual void setByInverseMatrix(const osg::Matrixd& matrix);
virtual osg::Matrixd getMatrix(void) const;
virtual osg::Matrixd getInverseMatrix(void)const ;
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);
float m_fAngle;
void ChangePosition(osg::Vec3& delta);
bool m_bPeng;
float m_fpushY;
float getSpeed() ;
void setSpeed(float &) ;
//void SetPosition(osg::Vec3 &position) ;
//osg::Vec3 GetPosition() ;
};

.cpp文件
#define TRAVEL_DLL _declspec(dllexport)
#include "TravelManipulator.h"

TravelManipulator::TravelManipulator(void): m_fMoveSpeed(1.5f)
, m_bLeftButtonDown(false)
, m_fpushX(0)
, m_fAngle(2.5)
, m_bPeng(true)
, m_fpushY(0)
{
m_vPosition = osg::Vec3(15.0f, -130.0f, 3.0f);
m_vRotation = osg::Vec3(osg::PI_2, 0.0f, 0.0f);
}

TravelManipulator::~TravelManipulator(void)
{
}

TravelManipulator * TravelManipulator::TravelScene(osg::ref_ptr<osgViewer::Viewer> viewer)
{
TravelManipulator* camera = new TravelManipulator;
//camera->m_nID = viewer->addCameraManipulator(camera);
//camera->m_pHostViewer = viewer;
return camera;
}

void TravelManipulator::Active(void)
{
m_pHostViewer->setCameraManipulator(new osgGA::TrackballManipulator());//selectCameraManipulator(m_nID);
}

void TravelManipulator::setByMatrix(const osg::Matrixd& matrix)
{
}

void TravelManipulator::setByInverseMatrix(const osg::Matrixd& matrix)
{
}

osg::Matrixd TravelManipulator::getMatrix(void) const
{
osg::Matrixd mat;
mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),
m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),
m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));
return mat * osg::Matrixd::translate(m_vPosition);
}

osg::Matrixd TravelManipulator::getInverseMatrix(void) const
{
osg::Matrixd mat;
mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),
m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),
m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));
return osg::Matrixd::inverse(mat * osg::Matrixd::translate(m_vPosition));
}

bool TravelManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us)
{
float mouseX = ea.getX();
float mouseY = ea.getY();
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::KEYDOWN):
{
if (ea.getKey() == 0x20)
{
us.requestRedraw();
us.requestContinuousUpdate(false);
return true;
}
if (ea.getKey() == 0xFF50)
{
ChangePosition(osg::Vec3 (0, 0, m_fMoveSpeed)) ;
return true;
}
if (ea.getKey() == 0xFF57) //end
{
ChangePosition(osg::Vec3 (0, 0, -m_fMoveSpeed)) ;
return true;
}
if (ea.getKey() == 0x2B)//+
{
m_fMoveSpeed += 1.0f;
return true;
}
if (ea.getKey() == 0x2D)//-
{
m_fMoveSpeed -= 1.0f;
if (m_fMoveSpeed < 1.0f)
{
m_fMoveSpeed = 1.0f;
}
return true;
}
if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
{
ChangePosition(osg::Vec3 (0, m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0)) ;
ChangePosition(osg::Vec3 (m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;
return true;
}
if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
{
ChangePosition(osg::Vec3 (0, -m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0)) ;
ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;
return true;
}
if (ea.getKey () == 0x41||ea.getKey () == 0x61)
{
ChangePosition(osg::Vec3 (0, m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0)) ;
ChangePosition(osg::Vec3 (-m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;
return true;
}
if (ea.getKey () == 0x44||ea.getKey () == 0x64)
{
ChangePosition(osg::Vec3 (0,-m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0)) ;
ChangePosition(osg::Vec3 (m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;
return true;
}
if (ea.getKey() == 0xFF53)//Right
{
m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle);
}
if (ea.getKey()== 0xFF51)//Left
{
m_vRotation._v[2] += osg::DegreesToRadians(m_fAngle);
}
if (ea.getKey() == 0x46 || ea.getKey() == 0x66)//F
{
computeHomePosition();
m_fAngle -= 0.2 ;
return true ;
}
if (ea.getKey() == 0x47 || ea.getKey() == 0x67)//G
{
m_fAngle += 0.2 ;
return true ;
}
return false;
}
case (osgGA::GUIEventAdapter ::PUSH ):
//
if ( ea.getButton () == 1)
{
m_fpushX = mouseX ;
m_fpushY = mouseY ;
m_bLeftButtonDown = true ;
}
return false ;
case (osgGA::GUIEventAdapter ::DRAG ):
if ( m_bLeftButtonDown)
{
m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle * (mouseX-m_fpushX));
m_vRotation._v[0] += osg::DegreesToRadians(1.1*(mouseY-m_fpushY)) ;
//
if (m_vRotation._v [0] >= 3.14)
m_vRotation._v [0] = 3.14 ;
if (m_vRotation._v [0] <= 0)
m_vRotation._v [0] = 0 ;
}
return false ;
case (osgGA::GUIEventAdapter ::RELEASE ):
if ( ea.getButton () == 1)
{
m_bLeftButtonDown = false ;
}
return false ;
default:
return false;
}
}

void TravelManipulator::ChangePosition(osg::Vec3& delta)
{
if (m_bPeng)
{
osg::Vec3 newPos = m_vPosition + delta;
osgUtil::IntersectVisitor iv;

osg::ref_ptr<osg::LineSegment>line = new osg::LineSegment(newPos,m_vPosition);
osg::ref_ptr<osg::LineSegment> lineZ = new osg::LineSegment(newPos +
osg::Vec3(0.0f, 0.0f, m_fMoveSpeed),newPos - osg::Vec3(0.0f, 0.0f, m_fMoveSpeed));
iv.addLineSegment(lineZ.get());
iv.addLineSegment (line.get()) ;
m_pHostViewer->getSceneData()->accept(iv);
if (!iv.hits())
{
m_vPosition += delta;
}
}
else
m_vPosition += delta;
}

void TravelManipulator::setSpeed (float &sp)
{
m_fMoveSpeed = sp ;
}

float TravelManipulator::getSpeed()
{
return m_fMoveSpeed ;
}

编译运行成功了,但是我到项目文件夹中只看到了dll文件,却没有看到lib文件。哪位知道是为什么吗?
...全文
1383 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
unituniverse2 2010-04-22
  • 打赏
  • 举报
回复
注意.h文件里的这一行:
class TRAVEL_DLL TravelManipulator
在dll工程里面是导出的,对于exe则变成了导入
才行。
unituniverse2 2010-04-22
  • 打赏
  • 举报
回复
要。

然后你的dll工程里面->属性->默认预处理器里加入TRVLM_EXPORTS
。对应的exe工程里不能加TRVLM_EXPORTS
ly0914 2010-04-22
  • 打赏
  • 举报
回复
试了一下上面的方法,还是不行。.cpp文件要改动吗?
处处留心 2010-04-22
  • 打赏
  • 举报
回复
就是少了个接口函数导出
unituniverse2 2010-04-22
  • 打赏
  • 举报
回复
我推翻刚才说的,改成:

#ifdef TRVLM_EXPORTS
#define TRAVEL_DLL _declspec(dllexport)
#else
#define TRAVEL_DLL _declspec(dllimport)
#pragma comment(lib, "TravelManip.lib") // 引号里面是你dll对应的lib文件名。如果名字不是这个,你改成实际的。
#endif

#include <osgViewer/Viewer>
#include <osgGA/MatrixManipulator>
#include <osgGA/TrackballManipulator>
#include <osgUtil/IntersectVisitor>
#include <osg/LineSegment>
#include <osg/Point>
#include <osg/Geometry>
#include <vector>

class TRAVEL_DLL TravelManipulator :
...

unituniverse2 2010-04-22
  • 打赏
  • 举报
回复


#ifdef TRVLM_EXPORTS
#define TRVLM_API __declspec(dllexport)
#else
#define TRVLM_API __declspec(dllimport)
#pragma comment(lib, "TransfPkg.lib")
#endif

#pragma once

......

class TRVLM_API TravelManipulator
{
......


然后你的dll工程里面->属性->默认预处理器里加入TRVLM_EXPORTS即可
ly0914 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zwfgdlc 的回复:]
class TravelManipulator
没有声明是导出的
改成这个

C/C++ code
class _declspec(dllimport) TravelManipulator
[/Quote]

是不是改成这样
class _declspec(dllimport) TravelManipulator :
public osgGA::MatrixManipulator
我试了一下,运行出现错误
ly0914 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zwfgdlc 的回复:]
class TravelManipulator
没有声明是导出的
改成这个

C/C++ code
class _declspec(dllimport) TravelManipulator
[/Quote]

我是个新手,请问一下怎么改,是改成这样吗?我改成这样试了一下,运行出错
尹成 2010-04-22
  • 打赏
  • 举报
回复
class TravelManipulator
没有声明是导出的
改成这个

C/C++ code
class _declspec(dllimport) TravelManipulator
fairuyy 2010-04-22
  • 打赏
  • 举报
回复
也可以在工程中添加*.def文件
田暗星 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zwfgdlc 的回复:]
class TravelManipulator
没有声明是导出的
改成这个

C/C++ code
class _declspec(dllimport) TravelManipulator
[/Quote]

正点回答
zwfgdlc 2010-04-22
  • 打赏
  • 举报
回复
class TravelManipulator
没有声明是导出的
改成这个
class _declspec(dllimport) TravelManipulator

社会栋梁 2010-04-22
  • 打赏
  • 举报
回复
你创建的项目是DLL项目?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧