我正在尝试学习装配如何在初级阶段工作,所以我一直在玩gcc汇编的-S输出.我写了一个简单的程序,定义了两个字节并返回它们的总和.整个计划如下:
int main(void) {
char A = 5;
char B = 10;
return A + B;
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时没有使用以下优化:
gcc -O0 -S -c test.c
Run Code Online (Sandbox Code Playgroud)
我得到test.s,如下所示:
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movb $5, 15(%esp)
movb $10, 14(%esp)
movsbl 15(%esp), %edx
movsbl 14(%esp), %eax
addl %edx, …Run Code Online (Sandbox Code Playgroud) 在VS2015中构建项目时出现以下链接错误:
LNK2001未解析的外部符号__imp__PathCombineW @ 12
函数PathCombineW来自shlwapi.h,我已将其包含在我的标题中.我发现这个令人困惑的部分是Intellisense很好地解析了这个函数,我可以在函数上"查看定义",它使我在shlwapi.h中的声明正确.
如果我尝试使用pathcch.h中的任何函数,我会遇到同样的问题.我最初使用此API,因为它似乎是更新的首选路径操作API.但是,我使用任何一个API获得了相同的LNK2001.
我无法弄清楚它是否与我所包含的其他标题有关.它们列在下面:
// daqServiceTray.cpp
#include "stdafx.h"
#include "daqServiceTray.h"
#include <Shlwapi.h>
#include <Shellapi.h>
#include <Strsafe.h>
//stdafx.h
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN
#ifndef _UNICODE
#define _UNICODE
#endif
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
//targetver.h
#pragma once
#define WINVER 0x0601
#define _WIN32_WINNT 0x0601
#include <SDKDDKVer.h>
//dayServiceTray.h
#pragma once
#include "resource.h"
Run Code Online (Sandbox Code Playgroud)
Resource.h是我的UI资源文件的标题.我正在将它们构建到win32 GUI应用程序中.我正在开发Windows 7.
通过错误阅读帮助我感觉我通过使用来自两个不同平台版本的代码引起了一些冲突,但是我在弄清楚可能存在的冲突时遇到了很多麻烦.在我尝试进行一些路径操作并添加了pathcch.h或shlwapi.h之前,应用程序正在构建并运行OK.
为什么intellisense能够通过链接器找到函数对我说一个未解析的外部?它能找到函数定义的库吗?我的订单是否包含问题?
我的核心问题是双重的:
intellisense如何找到函数,但链接器不能?
如果问题是找不到函数的定义,我怎样才能知道为目标平台编写应用程序需要包含哪些库(Windows 7)?我在MSDN上获取此信息时遇到了很多麻烦.是否有某种高级教程或页面解释了不同平台的构建规范的细微差别?