导航:首页 > 源码编译 > 编译dllobj

编译dllobj

发布时间:2022-12-15 17:36:19

Ⅰ C++编译后生成.obj、.pch、idb、pdb等文件,我要怎么做才能将这些文件编译成dll文件呢

做成DLL 可以使用特定的dll 工程,包括主函数的写法什么都有约定,我记得是这样,而不是把obj等文件转换变异成dll,动态链接的文件是通过编译输出一个函数接口,使用时候要动态import

Ⅱ c#使用命令行编译生成dll文件

C#使用csc.exe编译程序,csc使用/target:library(缩写: /t:library)参数生成Dll文件。
其它参数如下:
Visual C# 编译器选项
- 输出文件 -
/out:<文件> 指定输出文件名(默认值: 包含主类的文件或第一个文件的基名称)
/target:exe 生成控制台可执行文件(默认) (缩写: /t:exe)
/target:winexe 生成 Windows 可执行文件 (缩写: /t:winexe)
/target:library 生成库 (缩写: /t:library)
/target:mole 生成能添加到其他程序集的模块 (缩写: /t:mole)
/target:appcontainerexe 生成 Appcontainer 可执行文件 (缩写: /t:appcontainerexe)
/target:winmdobj 生成 WinMDExp 使用的 Windows 运行时中间文件 (缩写: /t:winmdobj)
/doc:<文件> 要生成的 XML 文档文件
/platform:<字符串> 限制可以在其上运行此代码的平台: x86、Itanium、x64、arm、anycpu32bitpreferred 或 anycpu。默认值为 anycpu。

- 输入文件 -
/recurse:<通配符> 根据通配符规范,包括当前目录和子目录下的所有文件
/reference:<别名>=<文件> 使用给定的别名从指定的程序集文件引用元数据 (缩写: /r)
/reference:<文件列表> 从指定的程序集文件引用元数据 (缩写: /r)
/addmole:<文件列表> 将指定的模块链接到此程序集中
/link:<文件列表> 嵌入指定的互操作程序集文件中的元数据 (缩写: /l)

- 资源 -
/win32res:<文件> 指定 Win32 资源文件(.res)
/win32icon:<文件> 对输出使用此图标
/win32manifest:<文件> 指定 Win32 清单文件(.xml)
/nowin32manifest 不包括默认 Win32 清单
/resource:<资源信息> 嵌入指定的资源 (缩写: /res)
/linkresource:<资源信息> 将指定的资源链接到此程序集 (缩写: /linkres)
其中 resinfo 的格式是 <file>[,<string name>[,public|private]]

- 代码生成 -
/debug[+|-] 发出调试信息
/debug:{full|pdbonly} 指定调试类型(“full”是默认类型,可以将调试程序附加到正在运行的程序)
/optimize[+|-] 启用优化 (缩写: /o)

- 错误和警告 -
/warnaserror[+|-] 将所有警告报告为错误
/warnaserror[+|-]:<警告列表> 将特定警告报告为错误
/warn:<n> 设置警告等级(0-4) (缩写: /w)
/nowarn:<警告列表> 禁用特定的警告消息

- 语言 -
/checked[+|-] 生成溢出检查
/unsafe[+|-] 允许“不安全”代码
/define:<符号列表> 定义条件编译符号 (缩写: /d)
/langversion:<字符串> 指定语言版本模式: ISO-1、ISO-2、3、4、5 或 Default

- 安全性 -
/delaysign[+|-] 仅使用强名称密钥的公共部分对程序集进行延迟签名
/keyfile:<文件> 指定强名称密钥文件
/keycontainer:<字符串> 指定强名称密钥容器
/highentropyva[+|-] 启用高平均信息量的 ASLR

- 杂项 -
@<文件> 有关更多选项,请阅读响应文件
/help 显示此用法信息 (缩写: /?)
/nologo 取消编译器版权信息
/noconfig 不要自动包含 CSC.RSP 文件

- 高级 -
/baseaddress:<地址> 要生成的库的基址
/bugreport:<文件> 创建“Bug 报告”文件
/codepage:<n> 指定打开源文件时要使用的代码页
/utf8output 以 UTF-8 编码格式输出编译器消息
/main:<类型> 指定包含入口点的类型(忽略所有其他可能的入口点) (缩写: /m)
/fullpaths 编译器生成完全限定路径
/filealign:<n> 指定用于输出文件节的对齐方式
/pdb:<文件> 指定调试信息文件名(默认值: 扩展名为 .pdb 的输出文件名)
/errorendlocation 输出每个错误的结束位置的行和列
/preferreilang 指定首选输出语言名称。
/nostdlib[+|-] 不引用标准库(mscorlib.dll)
/subsystemversion:<字符串> 指定此程序集的子系统版本
/lib:<文件列表> 指定要在其中搜索引用的附加目录
/errorreport:<字符串> 指定如何处理内部编译器错误: prompt、send、queue 或 none。默认值为 queue。
/appconfig:<文件> 指定一个包含程序集绑定设置的应用程序配置文件
/moleassemblyname:<字符串> 此模块所属程序集的名称

Ⅲ 如何编译生成dll

使用VC下的cl和link手工创建dll并实现函数导入

1、创建dll头文件:
/*
* dllmain.h
*/
#ifndef _DLLMAIN_H
#define _DLLMAIN_H

int getNumber();

#endif

2、创建dll源文件:
/*
* dllmain.c
*/
#include "dllmain.h"

int getNumber()
{
return 10;
}

3、 创建def文件:
; export.def
LIBRARY MY_DLLMAIN ; MY_DLLMAIN 将成为生成的dll的名称
EXPORTS
getNumber @1 ; 这个名称即为函数的实际导出名称 @1为函数的导出编号

4、生成dll文件:
cl dllmain.c /c
link /def:export.def /dll dllmain.obj

这时,工程中已经包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4个文件是编译链接过程中生成的文件

5、创建dlltest.c:
/*
* dlltest.c
*/
#include <stdio.h>
#include "dllmain.h" //dll库的头文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()
{
printf("%dn",getNumber());
}

6、编译、链接dlltest.c
cl dlltest.c /c
link dlltest.obj

注意:这里dllmain.lib和dllmain.h应该和dlltest.c在同一个目录中。此步的结果将生成 dlltest.exe

7、运行:
dlltest

这时,系统将载入my_dllmain.dll这个动态链接库,将调用其中的getNubmer函数。

Ⅳ 如何编译预置obj 文件

1. 如何在preloader 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2, JB, JB2
Step1. 首先获取obj 文件,如果是preloader 已有的Source code 需要预置为obj 文
件,那么可到如下路径获取obj 文件:mediatek/[source]/preloader/out
Step2. 在mediatek/[source]/preloader 目录下创建文件夹:myobjs,将Step1 中获取
的obj 文件放到该文件夹中
Step3. 修改mediatek/[source]/preloader/Makefile 文件,在该文件如下Code:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
之前添加:
MYOBJS := $(D_ROOT)/myobj
Step4. 修改mediatek/[source]/preloader/Makefile 中$(D_BIN)/$(PL_IMAGE_NAME).elf
生成命令,将MYOBJS 加入:如下:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
$(LD) --gc-sections -Bstatic -T$(MTK_PATH_PLATFORM)/link_descriptor.ld \
$(wildcard $(D_OBJ)/*) $(wildcard $(MYOBJS)/*) $(SECURITY_LIB) -Map
system.map -o $(D_BIN)/$(PL_IMAGE_NAME).elf
Step5. 如果添加的obj 文件在preloader 中有对应的Source code,还需要修改
Source code 对应的make File 文件,将该Source code 从make File 文件中删除,以
bmt.c 为例,需要修改medaitek/platform/$platform/preloader/src/drivers/makefile,
将bmt.c 从该文件的MOD_SRC 中删除
说明:preloader 的Source code 位于如下路径:
– mediatek/platform/$platform/preloader/
– mediatek/custom/$platform/preloader/
– mediatek/custom/common/preloader/
– mediatek/custom/$porject/preloader/
2. 如何在uboot 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2
Case1. 该obj 文件是从第三方处获取,在codebase 原本不存在.c 文件,不需要编
译进某个lib 文件
Step1. 首先获取obj 文件
Step2. 在bootable/bootloader/uboot 目录下添加myobjs 文件夹,将Step1 中获取的
obj 文件放到该文件夹中
Step3. 修改bootable/bootloader/uboot/Makefile,在该文件如下Code:
GEN_UBOOT = \
之前添加:
MYCUSTOMOBJS := $(wildcard myobjs/*)
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 修改bootable/bootloader/uboot/Makefile,将MYOBJSDIR 中的obj 文件添加
到u-boot 的生成命令中,如下:
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*$(SYM_PREFIX)__u_boot_cmd_.*/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(MYCUSTOMOBJS)
$(__OBJS) \
Case2. 该obj 文件在Codebase 中存在对应的.c 文件,现在需要将.c 文件删除,替
换为obj 文件
Step1. 编译生成obj 文件,uboot 编译生成的obj 文件与其.c 文件位于同级目录下
Step2.在原先obj 文件目录下创建一个文件夹prebuilt,并将obj 文件放入其中,同
时将.c 文件删除
Step3. 修改包含该.c 文件的Makefile 文件(一般与.c 文件位于同级目录下),将该obj
文件的名称从OBJS 变量中删除,同时在该Makefile 中添加一个变量,MYOBJS,将
该obj 文件添加到MYOBJS 中,以
bootable/bootloader/uboot/drivers/video/cfb_console.c 为例,修改该目录下的
Makefile 文件,将cfb_console.o 从变量OBJS 中删除,同时添加一行:
MYOBJS := cfb_console.o
Step4. 继续修改Step3 中的Makefile,将MYOBJS 添加到生成LIB 的命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
Case3. 某些模块,Uboot 和kernel 共用同一份Source code,比如LCM,这种情况
需要做特殊处理,以LCM 为例,如下:
Step1. 首先编译出obj 文件,路径位于:mediatek/custom/out/$project/uboot/lcm,
同时将要替换的Source code 删除(mediate/custom/common/kernel/lcm)
Step2. 在mediatek/custom/$project/uboot 下面添加lcm 文件夹,同时将Step1 中获
取到的obj 文件添加到该文件夹下,同时将原目录下的obj 文件删除(这里获取的
obj 文件一定要是Uboot 目录下的,不要到kernel 目录下获取这些obj 文件)
Step3. 修改mediatek/custom/common/uboot/Makefile 文件,将要替换的obj 文件
名称从COBJS 删除:COBJS += $(patsubst %.c, %.o, $(wildcard lcm/*.c))
Step4. 继续修改Step3 中的Makefile,添加如下Code:MYOBJS := $(addprefix $(obj),
$(wildcard lcm/*.o)),同时将MYOBJS 添加到$(LIB)的编译命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
说明:Uboot 的Source Code 主要位于如下路径:
– bootable/bootloader/uboot/
– mediatek/platform/$platform/uboot/
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
– mediatek/custom/$platform/uboot/
– mediatek/custom/common/uboot/
– mediatek/custom/$porject/uboot/
3. 如何在kernel 中预置obj 文件?
Branch:GB, GB2, ICS
– 比如要将xxx.c 用xxx.o 替代编译
– 先正常编译出xxx.o
– 然后在xxx.c 所在目录下创建prebuilt 目录,将xxx.o 放入
• 注意prebuilt 目录的目录名不能修改,否则在clean 阶段会被清除
– 修改xxx.c 所在目录下的Makefile 文件,原本已经有obj-y := xxx.o,在其后
面添加xxx-y := prebuilt/xxx.o 即可
– mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有Makefile 文件,
自己在Source code 对应的同级目录下添加一个Makefile 即可
Branch:ICS2, JB, JB2
– 比如要将debug.c 用debug.o 替代编译
– 先正常编译出debug.o (针对kernel 和lk, uboot 共用Source Code 的情况,
如LCM,这里获取 到的obj 文件一定要是kernel/out 目录下的)
– 然后将debug.o 复制到原先debug.c 所在目录下,并重命名为
debug.o_shipped
– 原先debug.c 同级目录下的Makefile 不变,依然保持为
obj-y:=debug.o;mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有
Makefile 文件,自己在Source code 对应的同级目录下添加一个Makefile 即可
– 重新编译kernel 即可
说明:kernel 的Source code 主要位于如下路径:
– kernel/
– mediatek/platform/$platform/kernel/
– mediatek/[source]/kernel/
– mediatek/custom/$platform/kernel/
– mediatek/custom/common/kernel/
– mediatek/custom/$porject/kernel/
4. 如何在lk 中预置obj 文件
Branch:JB,JB2
Step1. 在bootable/bootloader/lk/makefile 中添加:MYOBJ :=
Step2. 获取obj 文件,Codebase 编译生成的obj 文件位于
bootable/bootloader/lk/build-$project/custom/$project/lk 目录下
Step3. 将获取的obj 文件放到与.c 文件相同目录下;同时可将.c 文件删除
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 将相应的.c 文件从包含该.c 文件的rules.mk(一般与.c 文件位于同级目录)中删

Step5. 将Step3 中添加的.o 文件在rules.mk 中添加到MYOBJ,比如MYOBJ += test.o
Step6. 打开bootable/bootloader/lk/make/build.mk,将MYOBJ 添加到OUTELF 的生
成命令中,如下:
else
$(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT)
@echo linking $@
$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS)
$(MYOBJ) $(LIBGCC) -o $@ endif
Step7. 如果要替换的.c 文件是lk 与kernel 共用的,比如lcm 模块,那么Step2 需要
做一下修改:将获取的obj 文件放到mediatek/custom/$project/lk/lcm 中,同时要
确保这里获取的obj 文件是bootable/bootloader/lk/build-
$project/custom/$project/lk 目录下的,不要到kernel/out 目录下获取这些obj 文件
说明:lk 的Source Code 主要位于如下路径:
– mediatek/platform/$platform/lk/
– mediatek/custom/$platform/lk/
– mediatek/custom/common/lk/
– mediatek/custom/$porject/lk/
– bootable/bootloader/lk/
MEDIATEK CONFIDENTIAL

Ⅳ c语言编译生成的.obj文件解释下

c语言编译生成的.obj文件是一种文本文件,程序编译时生成的中间代码文件目标文件,一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成可执行文件了。OBJ只给出了程序的相对地址,而可执行文件是绝对地址。

obj文件基本结构:OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。

OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。

(5)编译dllobj扩展阅读:

C编译的整个过程很复杂,大致可以分为以下阶段:

1、预处理阶段

在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。

2、编译、优化阶段

编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。

3、汇编阶段

将汇编语言翻译成机器指令。

Ⅵ 怎么在编译dll文件时将自己写的类的构造函数作为接口

这里,我们为了简要说明DLL的原理,我们决定使用最简单的编译环境VC6.0,如下图,我们先建立一个新的Win32 Dynamic-Link Library工程,名称为“MyDLL”,在Visual Studio中,你也可以通过建立Win32控制台程序,然后在“应用程序类型”中选择“DLL”选项,

点击确定,选择“一个空的DLL工程”,确定,完成即可。

一个简单的dll

在第一步我们建立的工程中建立一个源码文件”dllmain.cpp“,在“dllmain.cpp”中,键入如下代码

#include <Windows.h>#include <stdio.h>BOOL APIENTRY DllMain(HMODULE hMole, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: printf("DLL_PROCESS_ATTACH "); break; case DLL_THREAD_ATTACH: printf("DLL_THREAD_ATTACH "); break; case DLL_THREAD_DETACH: printf("DLL_THREAD_DETACH "); break; case DLL_PROCESS_DETACH: printf("DLL_PROCESS_DETACH "); break; } return TRUE;}

之后,我们直接编译,即可以在Debug文件夹下,找到我们生成的dll文件,“MyDLL.dll”,注意,代码里面的printf语句,并不是必须的,只是我们用于测试程序时使用。而DllMain函数,是dll的进入/退出函数。

实际上,让线程调用DLL的方式有两种,分别是隐式链接和显式链接,其目的均是将DLL的文件映像映射进线程的进程的地址空间。我们这里只大概提一下,不做深入研究,如果感兴趣,可以去看《Window高级编程指南》的第12章内容。

隐式链接调用

隐士地链接是将DLL的文件影响映射到进程的地址空间中最常用的方法。当链接一个应用程序时,必须制定要链接的一组LIB文件。每个LIB文件中包含了DLL文件允许应用程序(或另一个DLL)调用的函数的列表。当链接器看到应用程序调用了某个DLL的LIB文件中给出的函数时,它就在生成的EXE文件映像中加入了信息,指出了包含函数的DLL文件的名称。当操作系统加载EXE文件时,系统查看EXE文件映像的内容来看要装入哪些DLL,而后试图将需要的DLL文件映像映射到进程的地址空间中。当寻找DLL时,系统在系列位置查找文件映像。

Ⅶ c怎么生成dll文件

用vc 6.0 下的cl.exe 和 link.exe工具,请读下文: 声明:下面这篇文章不是我写的,源自:一个叫,有容乃大 的博客 如何手工编写动态链接库(windows dll) 1.本例介绍在命令行(Console)环境下制作dll的方法 2.读者动手前,请确保在windows中安装有编译、链接工具和必要的函数库文件。 3.本例使用C语言实现. 4.本例中使用路径均为我机器上的绝对路径,读者需根据实际情况调整。 工具要求: Microsoft的编译器cl.exe MIcrosoft链接器link.exe dll制作步骤: 1.编写dll函数实现源代码hello.c #include int say_hello(char* name) { printf( "hello %s\n ", name); return 1; } 2.编写dll函数输出定义文件hello.def. LIBRARY hello EXPORTS say_hello @1 3.编译dll源码,生成dll,lib文件. 3.1 新建命令行窗口 3.2 设置PATH INCLUDE LIB 3个环境变量. SET PATH=K:\vcnet\vc7\bin;%PATH% SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE% SET LIB=K:\vsnet\Vc7\lib;%LIB% 3.3 编译hello.c cd K:\Source\dllsample (hello.c和hello.def所在目录) cl /c hello.c 3.4 链接hello.obj,生成hello.dll,hello.lib两个文件. link /def:hello.def /dll hello.obj 4.测试dll函数. 4.1 编写测试代码 test.c extern int say_hello(char* name); int main(int argc,char** argv) { say_hello( "robbie "); return 0; } 4.2 编译测试代码test.c cl /c test.c 4.3 链接test.obj和 hello.lib,生成可执行文件test.exe link test.obj hello.lib 4.4 运行test.exe,屏幕输出: hello robbie 至此,一个dll构造完毕. 下面是我自己的一点补充: 如果要在c++下,或者win32 mfc下使用标准c写的dll,必须把上面的声明 extern int say_hello(char* name);改成:extern "C " int say_hello(char* name);

Ⅷ 为什么我的易语言静态编译时编出个obj类型的文件

任何
编译器
都会生成obj文件,称之为目标代码文件。该文件通过连接程序(link)生成最后可执行文件(exe)或动态链接库文件(dll)。你可能只进行了
编译
,还要执行连接才能得到可执行文件或动态链接库文件。

Ⅸ C语言中main主函数怎样调用一个.obj文件和.dll文件,有几种情况

obj 是编译是产生的中间文件,是不可调用的。

dll 仅限于 window 平台,有平台相关性, 标准 C 是无法调用 dll 的。如果是用 VC ,那就很简单了,调一个加载函数就可以了。

Ⅹ obj 和 dll哪个保密更好

obj里还保留着大量链接器链接的时候要使用的符号,而这些很大部分是人类可读的
dll如果没有调试信息那么就剩导出符号了

阅读全文

与编译dllobj相关的资料

热点内容
wpsppt怎么转pdf格式 浏览:86
腾讯文档在线编辑怎么添加密码 浏览:868
本地不能访问服务器地址 浏览:865
访问服务器命令 浏览:835
华为云服务器分销商 浏览:954
Linux定位内存泄露 浏览:198
工程加密狗视频 浏览:720
不在内网怎么连接服务器 浏览:664
云服务器app安卓下载 浏览:966
如何查看linux服务器的核心数 浏览:137
交易平台小程序源码下载 浏览:148
程序员记笔记用什么app免费的 浏览:646
java与单片机 浏览:897
服务器内网如何通过公网映射 浏览:478
程序员穿越到宋代 浏览:624
怎么使用云服务器挂游戏 浏览:618
真实的幸福pdf 浏览:344
d盘php调用c盘的mysql 浏览:266
怎么样搭建源码网站 浏览:429
新概念四册pdf 浏览:364